log4j通用打包
log4j通用封装以前用 java 做工程需要调试信息都是自己 System.out.println,虽然很早就知道 log4j,不过没
log4j通用封装
以前用 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