Log4j 使用 ¶
内容
- Log4J配置文件学习
- 分析一个配置文件log4j.properties
- 结合commons-logging与log4j
- 输出格式控制符
- 各种记录方式的使用
- log4j 与 Spring
一、Log4J配置文件学习: ¶
Log4j支持两种配置文件格式,一种是XML格式的文件,一种是Java特性文件(键=值)。
配置文件要做的事:日志级别、选择器、输出方式、输出格式。
- 日志级别:
日志记录的优先级,分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定义的级别。Log4j建议只使用四个级别, 优先级从高到低分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关。 比如在这里定义了INFO级别,则应用程序中所有DEBUG级别的日志信息将不被打印出来。appenderName就是指定日志信息输出到哪个地方。 您可以同时指定多个输出目的地。
- 选择器: 就是指明记录日志的目标类对象,知道css,jquery等选择器吗?一个道理而已。
首先,log4j.rootLogger是根记录选择器,对项目中的所有类都有效,通常配置到控制台上。
例如 log4j.rootLogger=DEBUG, A1。debug指信息级别,A1(可以随便命名)指记录器,接下来会详细介绍各种记录器。
其次,某类和某个包下的控制。
log4j.logger.com.reyosoft.robin=debug // 表示robin包下的所有类的日志输出界别为debug
log4j.logger.com.reyosoft.robin.Test=INFO // 表示Test类的日志输出界别为INFO
最后,类中不同的记录,可能一个类有几种不同的日志要记录。就用这个方法啦。
log4j.logger.com.reyosoft.robin.Test.xxx=ERROR
log4j.logger.com.reyosoft.robin.Test.yyy=INFO
这里的xxx和yyy就是在Test类中定义的,格式如下:
private static Log log = LogFactory?.getLog(this.class.getClass+".xxx");
- 输出方式: 输出方式有
配置很简单,声明记录器,配置记录器。
声明记录器如下:
log4j.rootLogger=DEBUG, A1 log4j.logger.com.reyosoft.robin=debug,A2 log4j.logger.com.reyosoft.robin.Test.xxx=ERROR,A3,A4,A5 //注意这,可以同时附加个几个记录器哦!
配置记录器如下:
log4j.appender.A1=org.apache.log4j.ConsoleAppender? log4j.appender.A1.Threshold=info log4j.appender.A1.layout=org.apache.log4j.PatternLayout? log4j.appender.A1.layout.ConversionPattern?=%p [%t] %c{2} (%M:%L) - %m%n
log4j.appender.A2=org.apache.log4j.FileAppender? log4j.appender.A2.Threshold=info log4j.appender.A2.layout=org.apache.log4j.PatternLayout? log4j.appender.A2.layout.ConversionPattern?=%p [%t] %c{2} (%M:%L) - %m%n
A3 A4 A5 . . .
二、 分析一个配置文件log4j.properties ¶
log4j.rootCategory=debug,A1,A2 log4j.appender.A1=org.apache.log4j.ConsoleAppender log4j.appender.A1.layout=org.apache.log4j.PatternLayout log4j.appender.A1.layout.ConversionPattern=%5p[%t](%F:%L)-%m%n log4j.appender.A2=org.apache.log4j.RollingFileAppender log4j.appender.A2.File=example.log log4j.appender.A2.MaxFileSize=100KB log4j.appender.A2.MaxBackupIndex=1 log4j.appender.A2.layout=org.apache.log4j.PatternLayout log4j.appender.A2.layout.ConversionPattern=%p%t%c-%m%n
说明:
①log4j.rootCategory=[level],appenderName,appenderName,?
其中,level是日志记录的优先级,分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定义的级别。
②配置日志信息输出目的地Appender,
其中,Log4j提供的appender有以下几种: org.apache.log4j.ConsoleAppender?(控制台),
org.apache.log4j.FileAppender?(文件),
org.apache.log4j.DailyRollingFileAppender?(每天产生一个日志文件),
org.apache.log4j.RollingFileAppender?(文件大小到达指定尺寸的时候产生一个新的文件),
org.apache.log4j.WriterAppender?(将日志信息以流格式发送到任意指定的地方)
③配置日志信息的格式(布局),其语法为:
log4j.appender.appenderName.layout=fully.qualified.name.of.layout.class
log4j.appender.appenderName.layout.option1=value1
...
log4j.appender.appenderName.layout.option=valueN
其中,Log4j提供的layout有以下几种: org.apache.log4j.HTMLLayout(以HTML表格形式布局),
org.apache.log4j.PatternLayout?(可以灵活地指定布局模式),
org.apache.log4j.SimpleLayout?(包含日志信息的级别和信息字符串),
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
④Log4J采用类似C语言中的printf函数的打印格式格式化日志信息,打印参数接下来解释:
三、 结合commons-logging与log4j ¶
why: Commons-loggin的目的是为“所有的Java日志实现”提供一个统一的接口,它自身的日志功能平常弱(只有一个简单的SimpleLog??), 所以一般不会单独使用它。 Log4j的功能非常全面强大,是目前的首选。我发现几乎所有的Java开源项目都会用到Log4j,但我同时发现,所有用到Log4j的项目一般也同时 会用到commons-loggin。我想,大家都不希望自己的项目与Log4j绑定的太紧密吧。另外一个我能想到的“同时使用commons- logging和Log4j”的原因是,提供一个统一的日志接口,简单了操作,同时避免项目与某个日志实现系统紧密a耦合很贴心的帮我们自动选择适当的日 志实现系统(这一点非常好!)它甚至不需要配置
how: 1,把commons-logging.xx.jar放入classpath中。
2,查看classpath中是否有Log4j的包,如果发现,则自动使用Log4j作为日志实现类; 3, import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory?;
...
private static Log log = LogFactory?.getLog(this.class);
- 1 debug() 输出“调试”级别的日志信息;
- 2 info() 输出“信息”级别的日志信息;
- 3 warn() 输出“警告”级别的日志信息;
- 4 error() 输出“错误”级别的日志信息;
- 5 fatal() 输出“致命错误”级别的日志信息;
四、输出格式控制符 ¶
Log4J采用类似C语言中的printf函数的打印格式格式化日志信息 Each conversion specifier starts with a percent sign (%) and is followed by optional format modifiers and a conversion character. the format modifiers control such things as field width, padding, left and right justification. %-5p means the priority of the logging event should be left justified to a width of five characters.
【格式语法:】
%[格式修饰符][转义字符]
【格式修饰符】
包括字符宽度、字符padding左右控制。%50m 表示信息至少占据50字符位置,且靠右对齐。%-50m 就是考左对齐。
【转义字符】
- m (message)输出代码中指定的消息
- n (/n)输出一个回车换行符,Windows平台为“/r/n”,Unix平台为“/n”
- c (category) 所属类或包,例如:com.robin.app.Test 要输出Test类的位置,%c{3} 输出:robin.app.Test.
- d (date) 时间日期,默认格式(%d):{yyyy-MM-dd hh:mm:ss,SSS} ,自定义:%d{hh:mm:ss}
- F (file name) 所属文件名。常结合L使用,请看L
- L (line) 所属文件的行。例如:(%13F:%L) 输出:(Test.java:145) 如果是在控制台中,输出带有连接,点击后转到该文件
- l (location)输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。
- M (method) 方法名
- r (run) 输出自应用启动到输出该log信息耗费的毫秒数
- t (thread) 输出产生该日志事件的线程名
- p (priority) 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
五、各种记录方式的使用 ¶
# 应用于控制台
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender?
log4j.appender.Threshold=DEBUG
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout?
log4j.appender.CONSOLE.layout.ConversionPattern?=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
#应用于文件
log4j.appender.FILE=org.apache.log4j.FileAppender?
log4j.appender.FILE.File=file.log
log4j.appender.FILE.Append=false
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout?
log4j.appender.FILE.layout.ConversionPattern?=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
# 应用于文件回滚
log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender?
log4j.appender.ROLLING_FILE.Threshold=ERROR
log4j.appender.ROLLING_FILE.File=rolling.log
log4j.appender.ROLLING_FILE.Append=true
log4j.appender.ROLLING_FILE.MaxFileSize?=10KB
log4j.appender.ROLLING_FILE.MaxBackupIndex?=1
log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout?
log4j.appender.ROLLING_FILE.layout.ConversionPattern?=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
#应用于socket log4j.appender.SOCKET=org.apache.log4j.RollingFileAppender?
log4j.appender.SOCKET.RemoteHost?=localhost
log4j.appender.SOCKET.Port=5001
log4j.appender.SOCKET.LocationInfo?=true
# Set up for Log Facter 5
log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout?
log4j.appender.SOCET.layout.ConversionPattern?=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD]%n%c[CATEGORY]%n%m[MESSAGE]%n%n
# Log Factor 5 Appender
log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender
log4j.appender.LF5_APPENDER.MaxNumberOfRecords?=2000
# 发送日志给邮件
log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender
log4j.appender.MAIL.Threshold=FATAL
log4j.appender.MAIL.BufferSize?=10
log4j.appender.MAIL.From=xxx@www.xxx.com
log4j.appender.MAIL.SMTPHost=www.wusetu.com
log4j.appender.MAIL.Subject=Log4J Message
log4j.appender.MAIL.To=xxx@www.xxx.com
log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout?
log4j.appender.MAIL.layout.ConversionPattern?=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
# 用于数据库 log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/test
log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver
log4j.appender.DATABASE.user=root
log4j.appender.DATABASE.password=
log4j.appender.DATABASE.sql=INSERT INTO LOG4J (Message) VALUES ('[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n')
log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout?
log4j.appender.DATABASE.layout.ConversionPattern?=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender?
log4j.appender.A1.File=SampleMessages?.log4j
log4j.appender.A1.DatePattern?=yyyyMMdd-HH'.log4j'
log4j.appender.A1.layout=org.apache.log4j.xml.XMLLayout
输出到2000NT日志
把Log4j压缩包里的NTEventLogAppender.dll拷到WINNT/SYSTEM32目录下
log4j.logger.NTlog=FATAL, A8
# APPENDER A8
log4j.appender.A8=org.apache.log4j.nt.NTEventLogAppender
log4j.appender.A8.Source=JavaTest?
log4j.appender.A8.layout=org.apache.log4j.PatternLayout?
log4j.appender.A8.layout.ConversionPattern?=%-4r %-5p [%t] %37c %3x - %m%n
#自定义Appender
log4j.appender.im = net.cybercorlin.util.logger.appender.IMAppender
log4j.appender.im.host = mail.cybercorlin.net
log4j.appender.im.username = username
log4j.appender.im.password = password
log4j.appender.im.recipient = xxx@xxx.net
log4j.appender.im.layout=org.apache.log4j.PatternLayout?
log4j.appender.im.layout.ConversionPattern? =[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
六、log4j 与 Spring ¶
项目中必须是在使用spring,如果不使用spring,可以自己写个servlet,在web.xml添加一个监听器指向这个servlet,其实spring也是这么干的。 web.xml加入
<context-param> <param-name>webAppRootKey</param-name> <param-value>webApp.root</param-value> </context-param> <context-param> <param-name>log4jConfigLocation</param-name> <param-value>/WEB-INF/classes/log/log4j.properties</param-value> </context-param> <context-param> <param-name>log4jRefreshInterval</param-name> <param-value>600000</param-value> </context-param> <listener> <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> </listener>
然后log4j.properties里面指定文件路径的时候就可以用${webApp.root}/ log4j.appender.info.File=${webApp.root}/WEB-INF/logs/info.log 同时你的web项目必须有/WEB-INF/logs这个目录