Learning Traces...

--Great Love involves great effort
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

[转] Log4j 1.2.15 使用指南

Posted on 2010-01-29 22:06  suyang  阅读(1729)  评论(0编辑  收藏  举报

    因为公司的'Visibility'项目确定改成用java来写(原来是C#),所以日志工具也得从log4net转到log4j,在这里我东拼西凑出一些网上找出来的文章,以方便快速上手log4j。

 


 

  Log4j发展的真快,2005年用的时候版本是1.2.8。现在再看时发现都出到2.0了,仔细一看,还有点意思,log4j上作了个说明。log4j有3个分支,1.2是稳定版,1.3不再继续,2.0是实验版。

  看来还是用1.2版的比较好,现在的版本是1.2.15,和1.2.8比有很大的变化。从配置文件里反映出来,大的结构都变了。现把要点摘录如下:

  Log4j有3个主要部件,loggers, appenders and layouts.

  logger有如下几个级别,排列如下:DEBUG < INFO < WARN < ERROR < FATALlogger引入了继承的概念,这里指的是名称继承,logger com.foo是 com.foo.Bar的父logger。同样java.util是java.util.Vector的父类。另外Logger x = Logger.getLogger("wombat"); 和 Logger y = Logger.getLogger("wombat"); 是指向同一个对象,这样的话不需要到处传递对象的引用。  

  appender的意思是“输出的目的地”, 它可以是console,file,gui component,JMS,remote socket server,NT Event Log。任何写log的请求会被传递到这个logger所有的appender那里,同样也会传递到继承关系的上一级的logger的appender那里。appender会随着logger继承关系而附加继承。如果想停止这种附加继承,可以把additivity的标记设为false。

  layout顾名思义是管输出的格式的,PatternLayout是Log4j的标准输出格式,具体内容请参照javadoc。简单归纳一下PatternLayout,一般的格式是%+格式修饰符+转换字符。转换字符就是要显示哪些内容,可以参照javadoc查到,格式修饰符的规律如下:

Format modifier left justify minimum width maximum width comment
%20c false 20 none Left pad with spaces if the category name is less than 20 characters long.
%-20c true 20 none Right pad with spaces if the category name is less than 20 characters long.
%.30c NA none 30 Truncate from the beginning if the category name is longer than 30 characters.
%20.30c false 20 30 Left pad with spaces if the category name is shorter than 20 characters. However, if category name is longer than 30 characters, then truncate from the beginning.
%-20.30c true 20 30 Right pad with spaces if the category name is shorter than 20 characters. However, if category name is longer than 30 characters, then truncate from the beginning.

贴个例子:

配置文件:log4j.properties (如果用eclipse,要放在src目录下)

log4j.rootLogger=debug, A1, A2

log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%5p [%d{yyyy-MM-dd HH:mm:ss,SSS}] (%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=%5p %t %c - %m%n

.java文件:Log4jTest.java

package com.suyang;

import org.apache.log4j.*;

public class Log4jTest {
    
private static Logger logger = Logger.getLogger(Log4jTest.class.getName());
    
    
public static void main(String[] args) {
        logger.info("我在测试");
        
int x = 0;
        
try {
            x = 5 / x;
        }
        
catch(Exception e) {
            logger.info(e);
            logger.debug(e);
        }
    }
}


现在来说说上面配置文件的参数(把上面的配置文件分为三大块)

     第一块:log4j.rootLogger=debug,A1,A2
            a)log4j.rootLogger后面的第一个参数debug(这个值(显示的信息优先级)的取值范围为6种:ALL<DEBUG<INFO<WARN<ERROR<FATAL<OFF)
            b)上面例子中设置了DEBUG,则我程序中写的log.debug(),log.info(),log.warn()...级别>=DEBUG都会显示出来;
            c)如果你设置了INFO,那么我程序中写的log.debug()是不会被显示出来的,log.info(),log.warn()...这些内容才会显示出来;
            d)A1,A2两个为appender的名称(即,你可以每一个名称都对应一块内容),这两个参数结合第二,三大块内容来看;

     第二块:这一块是用来定义A1的appender的几个参数
            a)log4j.appender.A1=org.apache.log4j.ConsoleAppender(指明A1的显示方法,有下面几种取值)
                    org.apache.log4j.ConsoleAppender(控制台)
                    org.apache.log4j.FileAppender(文件)
                    org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
                    org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生新文件)
                    org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)

            b)log4j.appender.A1.layout=org.apache.log4j.PatternLayout(指明A1的显示信息的类型)
                    org.apache.log4j.HTMLLayout(以HTML表格形式布局)
                    org.apache.log4j.PatternLayout(可以灵活地指定布局模式)
                    org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)
                    org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)

            c)log4j.appender.A1.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n(指明A1的显示信息的格式)
                    %p 输出优先级,即ALL,DEBUG,INFO,WARN,ERROR,FATAL,OFF;
                    %r 输出自应用启动到输出该log信息耗费的毫秒数;
                    %c 输出所属的类目,通常就是所在类的全名;
                    %t 输出产生该日志事件的线程名;
                    %n 输出一个回车换行符,Windows平台为"\r\n",Unix平台为"\n";
                    %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,如(yyyy-MM-dd HH:mm:ss,SSS);
                    %L 输出代码中的行数;
                    %l 输出代码中的所属文件中的方法下面的行数;
                    %F 输出代码中的文件名;
                    %m 输出代码中的行数;
                    切记,上面的参数是区分大小写的;

      第三块:现在应该看得懂第三块的内容了吧! 


另外,将日志写入DB的配置文件如下:

log4j.rootLogger=WARN,DATABASE

#直接使用log4j包中的文件
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
=icy

#指定要插入数据库的格式
log4j.appender.DATABASE.sql
=INSERT INTO log4j (log_date, log_level, location, message) VALUES ('%d{ISO8601}', '%p', '%C,%L', '%m')

 


 

最后转几条小技巧:

1.NDC和MDC

2.动态修改日志配置文件

具体参看原文:[转自]http://rongsantang.ycool.com/post.1002996.html


[部分转自]http://www.javaeye.com/topic/185239