以前用 java 做工程需要调试信息都是自己 System.out.println,虽然很早就知道 log4j,不过没认真研究过,一般拿简单的 .property 文件来配置,不过最近仔细看了一下 log4j 的源文件,发现人家 apache 早就不建议使用 .property 了,首选 .xml,于是再研究了一下 .xml 的配置,这里记一下备忘。
- <?xml version="1.0" encoding="UTF-8" ?>
- <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
- <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
- <!-- Created by DavidHsing <DavidHsing@163.com>, on Oct.20 2009, pm -->
- <!-- logger 分 5 级: #FATAL-0, #ERROR-3, #WARN-4, #INFO-6, #DEBUG-7 -->
- <!--
- %c 输出日志信息所属的类的全名
- %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy-MM-dd HH:mm:ss },输出类似:2008-08-08 20:08:08
- %f 输出日志信息所属的类的类名
- %l 输出日志事件的发生位置,即输出日志信息的语句处于它所在的类的第几行
- %m 输出代码中指定的信息,如log(message)中的message
- %n 输出一个回车换行符,Windows平台为“rn”,Unix平台为“n”
- %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL。如果是调用debug()输出的,则为DEBUG,依此类推
- %r 输出自应用启动到输出该日志信息所耗费的毫秒数
- %t 输出产生该日志事件的线程名
- -->
- <!-- ============================================================== -->
- <!-- a console appender -->
- <!-- ============================================================== -->
- <appender name="Log.All.Console" class="org.apache.log4j.ConsoleAppender">
- <layout class="org.apache.log4j.PatternLayout">
- <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} [%-5p] [%t] %C{2} (%F:%L) - %m%n" />
- </layout>
- </appender>
- <!-- ============================================================== -->
- <!-- a file appender -->
- <!-- ============================================================== -->
- <appender name="Log.All.File" class="org.apache.log4j.FileAppender">
- <param name="File" value="log/AppRunLog.log" />
- <param name="Append" value="false" />
- <param name="Encoding" value="GBK" />
- <layout class="org.apache.log4j.PatternLayout">
- <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} [%-5p] [%t] %C{2} (%F:%L) - %m%n" />
- </layout>
- </appender>
- <category name="org.apache.log4j.xml">
- <priority value="debug" />
- </category>
- <!-- level = debug/off -->
- <root>
- <level value="debug" />
- <appender-ref ref="Log.All.Console" />
- <appender-ref ref="Log.All.File" />
- </root>
- </log4j:configuration>
这个 xml 是建好了,不过由于在运行时需要配置 XML,而这个配置 log4j 又限定只能配置一次,所以最简单的办法,就是再次封装一下,写个类来配置和提供 Logger:
- package xxx.utilities;
- import org.apache.log4j.*;
- import org.apache.log4j.spi.*;
- import org.apache.log4j.xml.*;
- /**
- * 通用 log4j 封装类
- * @author DavidHsing
- */
- public class Log4jLogger
- {
- private static final String r_sProfileName = "log4j.xml";
- static
- {
- DOMConfigurator.configure(Log4jLogger.class.getResource(r_sProfileName));
- }
- private Log4jLogger() {}
- public static String getProfileName() { return r_sProfileName; }
- public static Logger getLogger(Class clsClass)
- {
- return LogManager.getLogger(clsClass);
- }
- public static Logger getLogger(String sClassName)
- {
- return LogManager.getLogger(sClassName);
- }
- public static Logger getLogger(String sClassName, LoggerFactory lfLoggerFactory)
- {
- return LogManager.getLogger(sClassName, lfLoggerFactory);
- }
- }
这样,在调用的时候就不需要配置了,直接获取 Logger 并输出就 OK 了。
注意最好将 .xml 放到这个 java 类所在的同一目录(当然也可以通过在上述类里面指定路径)。
代码:
- package xxx;
- import org.apache.log4j.*;
- public class TestLog4j
- {
- protected Logger r_l4jlogger = Log4jLogger.getLogger(TestLog4j.class);
- //测试代码
- r_l4jlogger.error("这里是 DavidHsing 的 log4j 测试。");
- }
这样就可以正常的运行了。
不过最上面的 xml 只是个例子,真正要研究的话还有很多内容,比如按事件级别分别输出到不同地方等等,总之,log4j 是个很强大而且高效的东东,值得认真研究一下。
参考文献:
1、Apache Logging Project Homepage: http://logging.apache.org