1、 log4j简介
log4j 是一个开放源码项目,主要用于日志控制。一个项目如果需要log4j支持,需要引用log4j-1.2.13.jar。Log4j有三个主要的组件:Logger(日志写出器,供程序员输出日志信息)、Appender(日志目的地,把格式化好的日志信息输出到指定的地方去)和Layout(日志格式化器,用来把程序员的logging request格式化成字符串)。
2、 log4j配置文件介绍
通常将log4j配置信息放到独立的properties文件中,在代码中通过PropertyConfigurator.configure()函数从properties文件中加载配置信息。
配置文件中需要配置的信息如下
(1) Logger
Logger:需要指定的信息包括日志级别和日志器名称。建议只使用四个级别——ERROR、WARN、INFO、DEBUG(优先级从高到低,定义是不区分大小写)。同一个记录器可有多个名称,从而实现多个输出端。
配置实例:
A:根记录器对象(根记录器总是存在;根记录器没有名字)
log4j.rootLogger=debug,stdout,ROLLING_FILE
B:指定的logger对象实例
log4j.logger.org=error,stdout,ROLLING_FILE
(2) Appender
定义一个appender的输出目的地的格式为:
log4j.appender.appenderName = fully.qualified.name.of.appender.class
log4j提供了以下几种常用的输出目的地class:
• org.apache.log4j.ConsoleAppender,将日志信息输出到控制台
• org.apache.log4j.FileAppender,将日志信息输出到一个文件
• org.apache.log4j.DailyRollingFileAppender,将日志信息输出到一个,并且每天输出到一个新的日志文件
• org.apache.log4j.RollingFileAppender,将日志信息输出到一个文件,通过指定文件的的尺寸,当文件大小到达指定尺寸的时候会自动把文件改名,如名为example.log的文件会改名为example.log.1,同时产生一个新的example.log文件。如果新的文件再次达到指定尺寸,又会自动把文件改名为example.log.2,同时产生一个example.log文件。依此类推,直到example.log. MaxBackupIndex,MaxBackupIndex的值可在配置文件中定义。
• org.apache.log4j.WriterAppender,将日志信息以流格式发送到任意指定的地方。
• org.apache.log4j.jdbc.JDBCAppender,通过JDBC把日志信息输出到数据库中。
配置实例:
输出到控制台:
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
输出到文件:
log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender
# tomcat根目录/logs/bol_logs,如果指定文件夹不存在会自动创建
log4j.appender.ROLLING_FILE.File=../logs/bol_logs/run.log
#新产生的文件为追加形式
log4j.appender.ROLLING_FILE.Append=true
#每个日志文件大小的最大值
log4j.appender.ROLLING_FILE.MaxFileSize=1024KB
#最多备份文件数
log4j.appender.ROLLING_FILE.MaxBackupIndex=100
输出到数据库:
log4j.appender.JDBC=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.JDBC.BufferSize=1
log4j.appender.JDBC.Driver=oracle.jdbc.driver.OracleDriver
log4j.appender.JDBC.URL=jdbc:oracle:thin:@192.168.100.53:1522:jljf
log4j.appender.JDBC.User=a97
log4j.appender.JDBC.Password=a97
log4j.appender.JDBC.Sql=INSERT INTO LOGGING_TEST (log_date,log_level,location,message) VALUES (to_date('%d{yyyy-MM-dd HH:mm:ss}','YYYY-MM-DD HH24:MI:SS'),'%p','%c','%m')
log4j.appender.JDBC.layout=org.apache.log4j.PatternLayout
还有一些不常用的appender的配置,见附录
注意:1:当指定为RollingFileAppender设置MaxBackupIndex具体作用为:
1) 当example3.log文件的大小超过K时,就把文件改名为example3.log.1,同时生成一个新的example3.log文件
2) 当example3.log文件的大小再次超过1K,又把文件改名为example3.log.1。但由于此时example3.log.1已存在,则先把example3.log.1更名为example3.log.2,再把example3.log文件改名为example3.log.1
3) 同理,当example3.log文件的大小再次超过1K,先把example3.log.2文件更名为example3.log.3,把example3.log.1文件更名为example3.log.2,再把example3.log文件改名为example3.log.1
4) 当example3.log文件的大小再次超过1K,先把example3.log.2文件更名为example3.log.3,旧的example3.log.3文件将被覆盖;把example3.log.1文件更名为example3.log.2,旧的example3.log.2文件被覆盖;最后把example3.log文件改名为example3.log.1并覆盖掉旧的example3.log.1文件。
注意:2:Repository-wide threshold:
Repository-wide threshold指定的Level的优先级高于Logger本身的Level。语法为log4j.threshold=[level],level可以 为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL。也可以使用自定义Level,这时的语法为log4j.threshold =[level#classname]。默认为ALL。
依据上面的规则,我们有这样的结论:如果log4j.threshold=ERROR,Logger C的Level=DEBUG,这时只有高于等于ERROR的日志记录请求会被Logger C处理。
(3) Layout
定义一个appender的布局模式的格式为:
log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
log4j提供了以下几种常用的布局模式class:
• org.apache.log4j.HTMLLayout,以HTML表格形式布局
• org.apache.log4j.PatternLayout,可以灵活地指定布局模式
• org.apache.log4j.SimpleLayout,包含日志信息的级别和信息字符串
指定PatternLayout时,必须同时指定的ConversionPattern参数
常用参数的具体含义如下:
%c 列出logger名字空间的全称,如加上{<层数>}表示出从最内层算起的指定层数的名字空间
%X 按MDC(Mapped Diagnostic Context,线程映射表)输出日志。通常用于多个客户端连接同一台服务器,方便服务器区分是那个客户端访问留下来的日志。
%p 日志信息级别
%d %d{<日期格式>}:日志信息产生时间,使用ISO8601定义的日期格式
%C 日志信息所在地(全限类名)
%m 产生的日志具体信息
%n 输出日志信息换行
%F 显示调用logger的源文件名
%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数
%L 显示调用logger的代码行
%M 显示调用logger的方法名
%r 显示从程序启动时到记录该条日志时已经经过的毫秒数
%t 输出产生该日志事件的线程名
%% 显示一个
注意:%C 日志信息所在地(全限类名)这个参数似乎不好用,在本人接触过的一个系统中想要用这个参数输出日志发生的类,如此配置时log4j.appender.ROLLING_FILE.layout.ConversionPattern=%d - %C:%L - %-5p %C %x - %m%n,在日志中只输出了日志具体信息相当于只有%m有效。
3、 程序中引用
(1)配制文件加载
如果系统加入了spring框架,那么系统系统时会默认加载log4j.properties,如果要加载指定的属性文件可以用:
PropertyConfigurator.configure(“c:/log4j.properties");
注意:如果要排除spring日志的影响,可以改变log4j配置文件的名字或者位置,然后用上面的方式加载。
如果将配置文件改名,但仍需要spring加载,可以在web.xml中配置Log4jConfigListener,具体写法如下:
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>/WEB-INF/log4j.properties</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.util.Log4jConfigListener
</listener-class>
</listener>
(2)取得日志对象
取得根记录器对象可通过Logger.getRootLogger()函数,要取得非根记录器可通过Logger.getLogger (String logName)函数。可以指定的类的名字作为日志器的名字,其语法如下:
Logger.getLog(Class class)
(3)写入记录
写入不同级别的日志,其语法如下:
Logger.debug ( Object message ) ;
Logger.info ( Object message ) ;
Logger.warn ( Object message ) ;
Logger.error ( Object message ) ;
日志记录的顺序是从当前级别 + 更高级别,如果你的级别记录为info,则执行warn,error记录时候也写入日志信息。
4、 Bol系统中的特殊之处
(1) 将配置文件放到WEB-INF/cfg下,在web.xml中配置Log4jConfigListener
(2) 基类中都有一个私有的日志对象,通过getLog()方法,子类可以获得该对象,从而在需要的任意位置写入日志
注意:apache官方也提供了一个日志类,依赖于commons-logging.jar,其配置文件是%JAVA-HOME%/jre1.5.0_07/lib/ logging.properties,在类中通过LogFactory(org.apache.commons.logging包下)获得日志对象。这个类不如log4j方便。
5、 97系统中的特殊之处
正式库上配置了多个日志器,以每个子系统的包命名(例如so系统定义为log4j.logger.new97.so),每个子系统的日志写到各自的日志文件中(例如so系统的日志写到/bea/deploy/log/runSO.log文件中)。每个类根据类名来获取日志器,从而保证了日志信息写到自己子系统日志文件中。