首页 > 代码库 > log4j.xml配置示例
log4j.xml配置示例
这是log4j1.x版本讲解,log4j-1.2.16.jar
1、 一般的log4j.xml的两种配置方式:
1、Logger 完成日志信息的处理
定义输出的层次和决定信息是否输出
DEBUG<INFO<WARN<ERROR
2、Appender 设置日志信息的去向
常用的:
org.apache.log4j.ConsoleAppender(控制台)
org.apache.log4j.FileAppender(文件)
org.apache.log4j.DailyRollingFileAppener(每天产生一个日志文件)
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
org.apache.log4j.WriterAppender(将日志讯息以串流格式发送到任意指定的地方)
org.apache.log4j.JdbcAppender(将日志讯息保存到数据库中)
3、Layout 设置日志信息的输出样式
layout有以下几种:
org.apache.log4j.HTMLLayout(以HTML表格形式布局)
org.apache.log4j.SimpleLayout(包含日志讯息的级别和讯息字符串)
org.apache.log4j.TTCCLayout(包含日志产生的时间、执行绪、类别等讯息)
org.apache.log4j.PatterLayout(可以灵活地指定布局格式)
4、配置文件 log4j.xml
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"><log4j:configuration> <!-- 定义一个从控制台输出的日志信息 --> <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender"> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d - %c -%-4r [%t] %-5p %x - %m%n"/> </layout> <!--限制输出级别--> <filter class="org.apache.log4j.varia.LevelRangeFilter"> <param name="levelMin" value="DEBUG" /> <param name="levelMax" value="ERROR" /> <param name="AcceptOnMatch" value="true" /> </filter> </appender> <appender name="File_debug" class="org.apache.log4j.FileAppender"> <param name="File" value="C:/log4j_debug.log"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d - %c -%-4r [%t] %-5p %x - %m%n"/> </layout> <!--限制输出级别 只输出DEBUG级别--> <filter class="org.apache.log4j.varia.LevelRangeFilter"> <param name="levelMin" value="DEBUG" /> <param name="levelMax" value="DEBUG" /> <param name="AcceptOnMatch" value="true" /> </filter> </appender> <appender name="File_error" class="org.apache.log4j.FileAppender"> <param name="File" value="C:/log4j_error.log"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d - %c -%-4r [%t] %-5p %x - %m%n"/> </layout> <!--限制输出级别 只输出ERROR级别--> <filter class="org.apache.log4j.varia.LevelRangeFilter"> <param name="levelMin" value="ERROR" /> <param name="levelMax" value="ERROR" /> <param name="AcceptOnMatch" value="true" /> </filter> </appender> <!--<logger>的定义可以将各个包中的类日志输出到不同的日志文件中--> <!--com.litt2.log4j 目录下的日志会被打印到控制台中 --> <!---如果在root节点也包含<appender-ref ref="CONSOLE"/> 没有additivity="false"会重复打印<level value="http://www.mamicode.com/WARN"/>级别的日志信息 --> <logger name="com.litt2.log4j" additivity="false"> <level value="WARN"/> <appender-ref ref="CONSOLE"/> </logger> <!--<category></category>的作用和<logger>相同--> <!--com.litt3 目录下的日志会被打印到控制台中 --> <category name="com.litt3"> <level value="DEBUG"/> <appender-ref ref="CONSOLE"/> </category> <root> <priority value="debug"/> <appender-ref ref="File_debug"/> <appender-ref ref="File_error"/> </root></log4j:configuration>
<root>和<logger> 是并列的节点,不能在root节点中包含对logger节点的映射,之前看别人写的xml文件有在root节点中包含logger节点的错误。
使用log4j 在调用其他类的方法时,会发现打印出来的行号是不正确的(自己可以试验),可以自己写方法方法处理。
public class Logger { private Log logger; public Logger(Log logger) { this.logger = logger; } public void debug(String paramString) { logger.debug(getFunctionName() + paramString); } public void debug(String paramString, Throwable t) { logger.debug(getFunctionName() + paramString, t); } public void info(String paramString) { logger.info(getFunctionName() + paramString); } public void info(String paramString, Throwable t) { logger.info(getFunctionName() + paramString, t); } public void warn(String paramString, Throwable t) { logger.warn(getFunctionName() + paramString, t); } public void warn(String paramString) { logger.warn(getFunctionName() + paramString); } public void error(String paramString) { logger.error(getFunctionName() + paramString); } public void error(String paramString, Throwable paramThrowable) { logger.error(getFunctionName() + paramString, paramThrowable); } private String getFunctionName() { StackTraceElement[] sts = Thread.currentThread().getStackTrace(); if (sts == null) { return null; } for (StackTraceElement st : sts) { if (st.isNativeMethod()) { continue; } if (st.getClassName().equals(Thread.class.getName())) { continue; } if (st.getClassName().equals(this.getClass().getName())) { continue; }//获取行号和类名 log4j也能显示行号,但是log4j显示的行号不准确。 return "[" + st.getClassName() + ":" + st.getLineNumber() + "] - "; } return null; }}
StackTraceElement[] sts = Thread.currentThread().getStackTrace(); 不明白可以查询jdk的API, 是去的方法的栈信息
public class LoggerFactory { public static Logger getLogger(Class<?> clazz) { return new Logger(LogFactory.getLog(clazz)); } public static Logger getLogger(String loggerName) { return new Logger(LogFactory.getLog(loggerName)); }}
使用:
private Logger logger1 = LoggerFactory.getLogger(this.getClass()); 或者类名.class
如何使用log4j 参考 《log4j从入门到详解.pdf》
参考
http://blog.csdn.net/subuser/article/details/20645163
http://heavyz.sourceforge.net/homepage/homepage_zh/comp/notes/log4j.html
http://blog.csdn.net/xiechao240/article/details/5922208
http://www.uml.org.cn/j2ee/201311051.asp