首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

log4j通用打包

2012-10-13 
log4j通用封装以前用 java 做工程需要调试信息都是自己 System.out.println,虽然很早就知道 log4j,不过没

log4j通用封装

以前用 java 做工程需要调试信息都是自己 System.out.println,虽然很早就知道 log4j,不过没认真研究过,一般拿简单的 .property 文件来配置,不过最近仔细看了一下 log4j 的源文件,发现人家 apache 早就不建议使用 .property 了,首选 .xml,于是再研究了一下 .xml 的配置,这里记一下备忘。

  1. <?xml?version="1.0"?encoding="UTF-8"??>?? <!DOCTYPE?log4j:configuration?SYSTEM?"log4j.dtd">??
  2. ?? <log4j:configuration?xmlns:log4j="http://jakarta.apache.org/log4j/">??
  3. ?? ????<!--?Created?by?DavidHsing?<DavidHsing@163.com>,?on?Oct.20?2009,?pm?-->??
  4. ?? ????<!--?logger?分?5?级:?#FATAL-0,?#ERROR-3,?#WARN-4,?#INFO-6,?#DEBUG-7?-->??
  5. ????<!-- ?? ????%c?输出日志信息所属的类的全名 ??
  6. ????%d?输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy-MM-dd?HH:mm:ss?},输出类似:2008-08-08?20:08:08 ?? ????%f?输出日志信息所属的类的类名 ??
  7. ????%l?输出日志事件的发生位置,即输出日志信息的语句处于它所在的类的第几行 ?? ????%m?输出代码中指定的信息,如log(message)中的message ??
  8. ????%n?输出一个回车换行符,Windows平台为“rn”,Unix平台为“n” ?? ????%p?输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL。如果是调用debug()输出的,则为DEBUG,依此类推 ??
  9. ????%r?输出自应用启动到输出该日志信息所耗费的毫秒数 ?? ????%t?输出产生该日志事件的线程名 ??
  10. ????-->?? ??
  11. ?? ????<!--?==============================================================?-->??
  12. ????<!--???????????????????????a?console?appender???????????????????????-->?? ????<!--?==============================================================?-->??
  13. ????<appender?name="Log.All.Console"?class="org.apache.log4j.ConsoleAppender">?? ????????<layout?class="org.apache.log4j.PatternLayout">??
  14. ????????????<param?name="ConversionPattern"?value="%d{yyyy-MM-dd?HH:mm:ss}?[%-5p]?[%t]?%C{2}?(%F:%L)?-?%m%n"?/>?? ????????</layout>??
  15. ????</appender>?? ??
  16. ????<!--?==============================================================?-->?? ????<!--?????????????????????????a?file?appender????????????????????????-->??
  17. ????<!--?==============================================================?-->?? ????<appender?name="Log.All.File"?class="org.apache.log4j.FileAppender">??
  18. ????????<param?name="File"?value="log/AppRunLog.log"?/>?? ????????<param?name="Append"?value="false"?/>??
  19. ????????<param?name="Encoding"?value="GBK"?/>?? ????????<layout?class="org.apache.log4j.PatternLayout">??
  20. ????????????<param?name="ConversionPattern"?value="%d{yyyy-MM-dd?HH:mm:ss}?[%-5p]?[%t]?%C{2}?(%F:%L)?-?%m%n"?/>?? ????????</layout>??
  21. ????</appender>?? ??
  22. ????<category?name="org.apache.log4j.xml">?? ??????<priority?value="debug"?/>??
  23. ????</category>?? ??
  24. ????<!--?level?=?debug/off?-->?? ????<root>??
  25. ???????<level?value="debug"?/>?? ???????<appender-ref?ref="Log.All.Console"?/>??
  26. ???????<appender-ref?ref="Log.All.File"?/>?? ????</root>??
  27. ?? </log4j:configuration>??

这个 xml 是建好了,不过由于在运行时需要配置 XML,而这个配置 log4j 又限定只能配置一次,所以最简单的办法,就是再次封装一下,写个类来配置和提供 Logger:

  1. package?xxx.utilities; ?? ??
  2. import?org.apache.log4j.*; ?? import?org.apache.log4j.spi.*; ??
  3. import?org.apache.log4j.xml.*; ?? ??
  4. ?? /** ?
  5. ?*?通用?log4j?封装类 ? ?*?@author?DavidHsing ?
  6. ?*/?? public?class?Log4jLogger ??
  7. { ?? ????private?static?final?String?r_sProfileName?=?"log4j.xml"; ??
  8. ?? ????static??
  9. ????{ ?? ????????DOMConfigurator.configure(Log4jLogger.class.getResource(r_sProfileName)); ??
  10. ????} ?? ??
  11. ????private?Log4jLogger()?{} ?? ??
  12. ????public?static?String?getProfileName()?{?return?r_sProfileName;?} ?? ??
  13. ????public?static?Logger?getLogger(Class?clsClass) ?? ????{ ??
  14. ????????return?LogManager.getLogger(clsClass); ?? ????} ??
  15. ?? ????public?static?Logger?getLogger(String?sClassName) ??
  16. ????{ ?? ????????return?LogManager.getLogger(sClassName); ??
  17. ????} ?? ??
  18. ????public?static?Logger?getLogger(String?sClassName,?LoggerFactory?lfLoggerFactory) ?? ????{ ??
  19. ????????return?LogManager.getLogger(sClassName,?lfLoggerFactory); ?? ????} ??
  20. }??

这样,在调用的时候就不需要配置了,直接获取 Logger 并输出就 OK 了。

注意最好将 .xml 放到这个 java 类所在的同一目录(当然也可以通过在上述类里面指定路径)。

代码:

  1. package?xxx; ?? ??
  2. import?org.apache.log4j.*; ?? ??
  3. public?class?TestLog4j ?? { ??
  4. ????protected?Logger?r_l4jlogger?=?Log4jLogger.getLogger(TestLog4j.class); ?? ??
  5. ????//测试代码 ?? ????r_l4jlogger.error("这里是?DavidHsing?的?log4j?测试。"); ??
  6. }??

这样就可以正常的运行了。

不过最上面的 xml 只是个例子,真正要研究的话还有很多内容,比如按事件级别分别输出到不同地方等等,总之,log4j 是个很强大而且高效的东东,值得认真研究一下。

参考文献:

1、Apache Logging Project Homepage: http://logging.apache.org

热点排行