首页
登录 | 注册

log4j使用笔记

Java程序最常用的日志系统大概就是apache的log4j了,它的功能简单说就是“记录日志”。它主要由logger、appender和layout这3个对象构成,logger是一个具体的“记录器”,appender是记录器的“输出对象”,它可以是屏幕输出、文件、界面组件、socket等。layout是appender的属性,决定appender所代表的输出中,一条具体的记录由哪些信息组成,排列顺序等。

每一个logger都有一个名字,名字是logger初始化时由getLogger的参数决定的,例如下面的logger的名字是com.foo:
  1. Logger logger = Logger.getLogger("com.foo");
名字是logger的唯一标识符,例如下面的x和y两个logger实际上是同一个对象:
  1. Logger x = Logger.getLogger("wombat");
  2. Logger y = Logger.getLogger("wombat");
名字还具有继承性,例如名为com.foo.bar的logger是com.foo这个logger的子logger,com.foo又是com的子logger,子logger会继承所有上级logger的appender。这种继承类似于java包的父目录和子目录的关系,详见[1]的"Named Hierarchy"部分。

类似于根目录的概念,rootLogger是logger hierarchy的顶端,简单的log4j应用中,只定义rootLogger的appender,所有类中的logger就继承了rootLogger的特性。

为一个logger指定appender是在log4j配置文件中定义的,格式是:
  1. log4j.rootLogger=level_name, appender_name1, appender_name2, ...
  1. log4j.logger.logger_name=level_name, appender_name1, appender_name2, ...
前者为rootLogger指定appender,后者为某一个具体的logger指定appender。定义appender属性的方法是:
  1. log4j.appender.appender_name=...
  2. log4j.appender.appender_name.layout=...
例如下面的代码为rootLogger指定了appender A1,并设置A1为界面输出,然后指定了输出的格式,最后一行指定了com.foo的输出级别为WARN,com.foo及其子logger低于WARN的日志将不记录,由于com.foo没有指定appender,所以继承rootLogger的A1作为其输出:
  1. log4j.rootLogger=DEBUG, A1
  2. log4j.appender.A1=org.apache.log4j.ConsoleAppender
  3. log4j.appender.A1.layout=org.apache.log4j.PatternLayout
  4. log4j.appender.A1.layout.ConversionPattern=%d [%t] %-5p %c - %m%n
  5. log4j.logger.com.foo=WARN
logger的级别常用的有debug, info, warn, error四种,详见“log4j日志的输出级别设置”;appender常用的有ConsoleAppender(控制台输出)、DailyRollingFileAppender(按照一定的频率滚动输出日志,例如每月、每周、每天、每小时等)和RollingFileAppender(到一定文件大小时滚动输出)三种;layout常用的有SimpleLayout, PatternLayout, HTMLLayout, XMLLayout四种,后两种用来输出html和xml文本。不论哪种layout,都输出的是纯文本,因此各种appender与各种layout可以随意组合。
如果对项目中一些类的日志进行特殊处理(例如更改输出级别、指定新的输出文件等),见笔记“在包一级定制log4j日志输出”。

下面是一个完整的日志演示,首先是测试用例,只打一条日志:
  1. package com.boco.godu.gapi.logger;
  2. import org.apache.log4j.Logger;
  3. import org.junit.Test;
  4. public class Log4jDemo {
  5. private final Logger logger = Logger.getLogger(this.getClass());
  6. @Test
  7. public void testGapiLogger() {
  8. logger.info("Apache Logger");
  9. }
  10. }
log4j.properties文件:
  1. log4j.rootLogger=debug, console, ft, fh, fx

  2. log4j.appender.console=org.apache.log4j.ConsoleAppender
  3. log4j.appender.console.layout=org.apache.log4j.SimpleLayout

  4. log4j.appender.ft=org.apache.log4j.RollingFileAppender
  5. log4j.appender.ft.File=./log/debug.log
  6. log4j.appender.ft.Append=false
  7. log4j.appender.ft.MaxFileSize=2MB
  8. log4j.appender.ft.MaxBackupIndex=10
  9. log4j.appender.ft.layout=org.apache.log4j.PatternLayout
  10. log4j.appender.ft.layout.ConversionPattern=%d{MM-dd HH:mm:ss,SSS} %t %c,%L %p - %m%n

  11. log4j.appender.fh=org.apache.log4j.RollingFileAppender
  12. log4j.appender.fh.File=./log/debug.html
  13. log4j.appender.fh.Append=false
  14. log4j.appender.fh.MaxFileSize=2MB
  15. log4j.appender.fh.MaxBackupIndex=10
  16. log4j.appender.fh.layout=org.apache.log4j.HTMLLayout
  17. log4j.appender.fh.layout.LocationInfo=true
  18. log4j.appender.fh.layout.Title=Test Log4j Layout

  19. log4j.appender.fx=org.apache.log4j.RollingFileAppender
  20. log4j.appender.fx.File=./log/debug.xml
  21. log4j.appender.fx.Append=false
  22. log4j.appender.fx.MaxFileSize=2MB
  23. log4j.appender.fx.MaxBackupIndex=10
  24. log4j.appender.fx.layout=org.apache.log4j.xml.XMLLayout
  25. log4j.appender.fx.layout.LocationInfo=true
rootLogger一共挂了4个appender,分别是一个控制台输出,一个纯文本格式日志,一个html格式日志,一个xml格式日志。
运行测试用例后的效果如下(黑体字和红圈是源代码打出的日志):
控制台输出:
INFO - Apache Logger

纯文本文件:
08-11 16:04:03,343 main com.boco.godu.gapi.logger.Log4jDemo,11 INFO - Apache Logger
html文件:图略
xml文件:
  1. <log4j:event logger="com.boco.godu.gapi.logger.Log4jDemo" timestamp="1313049843343" level="INFO" thread="main">
  2. ><![CDATA[Apache Logger]]></log4j:message>
  3. ="com.boco.godu.gapi.logger.Log4jDemo" method="testGapiLogger" file="Log4jDemo.java" line="11"/>
  4. </log4j:event>

相关文章


2020 unjeep.com webmaster#unjeep.com
12 q. 0.014 s.
京ICP备10005923号