log4j使用 properties and .xml

log4j配置
在强调可重用组件开发的今天,除了自己从头到尾开发一个可重用的日志操作类外,Apache为我们提供了一个强有力的日志操作包-Log4j

Log4j
Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。

此外,通过Log4j其他语言接口,您可以在CC++.NetPL/SQL程序中使用Log4j,其语法和用法与在Java程序中一样,使得多语言分布式系统得到一个统一一致的日志组件模块。而且,通过使用各种第三方扩展,您可以很方便地将Log4j集成到J2EEJINI甚至是SNMP应用中。

说明:下面分为三部分,第一部分讲解如何配置log4j,第二部分为对log4j.properties配置文件中的各个属性的讲解,第三部分为对log4j的详细讲解,如果只想配置上log4j,那么只需要看前两个部分就可以,如果想对log4j深入了解,则还需看第三部分。

一、Log4j配置

第一步:加入log4j-1.2.8.jarlib下。

第二步:在CLASSPATH下建立log4j.properties。内容如下:

1 log4j.rootCategory=INFO, stdout , R

2

3 log4j.appender.stdout=org.apache.log4j.ConsoleAppender

4 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

5 log4j.appender.stdout.layout.ConversionPattern=[QC] %p [%t] %C.%M(%L) | %m%n

6

7 log4j.appender.R=org.apache.log4j.DailyRollingFileAppender

8 log4j.appender.R.File=D:/Tomcat 5.5/logs/qc.log

9 log4j.appender.R.layout=org.apache.log4j.PatternLayout

10 log4j.appender.R.layout.ConversionPattern=%d-[TS] %p %t %c - %m%n

11

12 log4j.logger.com.neusoft=DEBUG

13 log4j.logger.com.opensymphony.oscache=ERROR

14 log4j.logger.net.sf.navigator=ERROR

15 log4j.logger.org.apache.commons=ERROR

16 log4j.logger.org.apache.struts=WARN

17 log4j.logger.org.displaytag=ERROR

18 log4j.logger.org.springframework=DEBUG

19 log4j.logger.com.ibatis.db=WARN

20 log4j.logger.org.apache.velocity=FATAL

21

22 log4j.logger.com.canoo.webtest=WARN

23

24 log4j.logger.org.hibernate.ps.PreparedStatementCache=WARN

25 log4j.logger.org.hibernate=DEBUG

26 log4j.logger.org.logicalcobwebs=WARN

第三步:相应的修改其中属性,修改之前就必须知道这些都是干什么的,在第二部分讲解。

第四步:在要输出日志的类中加入相关语句:

定义属性:protected final Log log = LogFactory.getLog(getClass());

在相应的方法中:

if (log.isDebugEnabled())

{

log.debug("System .....");

}

二、Log4j说明

1 log4j.rootCategory=INFO, stdout , R

此句为将等级为INFO的日志信息输出到stdoutR这两个目的地,stdoutR的定义在下面的代码,可以任意起名。等级可分为OFFFATALERRORWARNINFODEBUGALL,如果配置OFF则不打出任何信息,如果配置为INFO这样只显示INFO, WARN, ERRORlog信息,而DEBUG信息不会被显示,具体讲解可参照第三部分定义配置文件中的logger

3 log4j.appender.stdout=org.apache.log4j.ConsoleAppender

此句为定义名为stdout的输出端是哪种类型,可以是

org.apache.log4j.ConsoleAppender
(控制台),

org.apache.log4j.FileAppender
(文件),

org.apache.log4j.DailyRollingFileAppender
(每天产生一个日志文件),

org.apache.log4j.RollingFileAppender
(文件大小到达指定尺寸的时候产生一个新的文件)

org.apache.log4j.WriterAppender
(将日志信息以流格式发送到任意指定的地方)

具体讲解可参照第三部分定义配置文件中的Appender

4 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

此句为定义名为stdout的输出端的layout是哪种类型,可以是

org.apache.log4j.HTMLLayout
(以HTML表格形式布局),

org.apache.log4j.PatternLayout
(可以灵活地指定布局模式),

org.apache.log4j.SimpleLayout
(包含日志信息的级别和信息字符串),

org.apache.log4j.TTCCLayout
(包含日志产生的时间、线程、类别等等信息)

具体讲解可参照第三部分定义配置文件中的Layout

5 log4j.appender.stdout.layout.ConversionPattern= [QC] %p [%t] %C.%M(%L) | %m%n

如果使用pattern布局就要指定的打印信息的具体格式ConversionPattern,打印参数如下:

%m
输出代码中指定的消息

%p
输出优先级,即DEBUGINFOWARNERRORFATAL

%r
输出自应用启动到输出该log信息耗费的毫秒数

%c
输出所属的类目,通常就是所在类的全名

%t
输出产生该日志事件的线程名

%n
输出一个回车换行符,Windows平台为"rn"Unix平台为"n"

%d
输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyy MMM dd HH:mm:ss,SSS},输出类似:20021018 221028921

%l
输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。

[QC]
log信息的开头,可以为任意字符,一般为项目简称。

输出的信息

[TS] DEBUG [main] AbstractBeanFactory.getBean(189) | Returning cached instance of singleton bean 'MyAutoProxy'

具体讲解可参照第三部分定义配置文件中的格式化日志信息。

7 log4j.appender.R=org.apache.log4j.DailyRollingFileAppender

此句与第3行一样。定义名为R的输出端的类型为每天产生一个日志文件。

8 log4j.appender.R.File=D:/Tomcat 5.5/logs/qc.log

此句为定义名为R的输出端的文件名为D:/Tomcat 5.5/logs/qc.log

可以自行修改。

9 log4j.appender.R.layout=org.apache.log4j.PatternLayout

与第4行相同。

10 log4j.appender.R.layout.ConversionPattern=%d-[TS] %p %t %c - %m%n

与第5行相同。

12 log4j.logger.com. neusoft =DEBUG

指定com.neusoft包下的所有类的等级为DEBUG

可以把com.neusoft改为自己项目所用的包名。

13 log4j.logger.com.opensymphony.oscache=ERROR

14 log4j.logger.net.sf.navigator=ERROR

这两句是把这两个包下出现的错误的等级设为ERROR,如果项目中没有配置EHCache,则不需要这两句。

15 log4j.logger.org.apache.commons=ERROR

16 log4j.logger.org.apache.struts=WARN

这两句是struts的包。

17 log4j.logger.org.displaytag=ERROR

这句是displaytag的包。(QC问题列表页面所用)

18 log4j.logger.org.springframework=DEBUG

此句为Spring的包。

24 log4j.logger.org.hibernate.ps.PreparedStatementCache=WARN

25 log4j.logger.org.hibernate=DEBUG

此两句是hibernate的包。

以上这些包的设置可根据项目的实际情况而自行定制。

三、log4j详解

1
、定义配置文件

Log4j
支持两种配置文件格式,一种是XML格式的文件,一种是Java特性文件log4j.properties(键=值)。下面将介绍使用log4j.properties文件作为配置文件的方法:

、配置根Logger

Logger
负责处理日志记录的大部分操作。

其语法为:

log4j.rootLogger = [ level ] , appenderName, appenderName, ...

其中,level 是日志记录的优先级,分为OFFFATALERRORWARNINFODEBUGALL或者自定义的级别。Log4j建议只使用四个级别,优先级从高到低分别是ERRORWARNINFODEBUG。通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关。比如在这里定义了INFO级别,只有等于及高于这个级别的才进行处理,则应用程序中所有DEBUG级别的日志信息将不被打印出来。ALL:打印所有的日志,OFF:关闭所有的日志输出。 appenderName就是指定日志信息输出到哪个地方。可同时指定多个输出目的地。

、配置日志信息输出目的地 Appender

Appender
负责控制日志记录操作的输出。

其语法为:

log4j.appender.appenderName = fully.qualified.name.of.appender.class

log4j.appender.appenderName.option1 = value1

...

log4j.appender.appenderName.optionN = valueN

这里的appenderName为在里定义的,可任意起名。

其中,Log4j提供的appender有以下几种:

org.apache.log4j.ConsoleAppender
(控制台),

org.apache.log4j.FileAppender
(文件),

org.apache.log4j.DailyRollingFileAppender
(每天产生一个日志文件),

org.apache.log4j.RollingFileAppender
(文件大小到达指定尺寸的时候产生一个新的文件),可通过log4j.appender.R.MaxFileSize=100KB设置文件大小,还可通过log4j.appender.R.MaxBackupIndex=1设置为保存一个备份文件。

org.apache.log4j.WriterAppender
(将日志信息以流格式发送到任意指定的地方)

例如:log4j.appender.stdout=org.apache.log4j.ConsoleAppender

定义一个名为stdout的输出目的地,ConsoleAppender为控制台。

、配置日志信息的格式(布局)Layout

Layout
负责格式化Appender的输出。

其语法为:

log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class

log4j.appender.appenderName.layout.option1 = value1

...

log4j.appender.appenderName.layout.optionN = valueN

其中,Log4j提供的layout有以下几种:

org.apache.log4j.HTMLLayout
(以HTML表格形式布局),

org.apache.log4j.PatternLayout
(可以灵活地指定布局模式),

org.apache.log4j.SimpleLayout
(包含日志信息的级别和信息字符串),

org.apache.log4j.TTCCLayout
(包含日志产生的时间、线程、类别等等信息)

2
、格式化日志信息

Log4J
采用类似C语言中的printf函数的打印格式格式化日志信息,打印参数如下:

%m
输出代码中指定的消息

%p
输出优先级,即DEBUGINFOWARNERRORFATAL

%r
输出自应用启动到输出该log信息耗费的毫秒数

%c
输出所属的类目,通常就是所在类的全名

%t
输出产生该日志事件的线程名

%n
输出一个回车换行符,Windows平台为"rn"Unix平台为"n"

%d
输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyy MMM dd HH:mm:ss,SSS},输出类似:20021018 221028921

%l
输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。

3
、在代码中使用Log4j

我们在需要输出日志信息的类中做如下的三个工作:

1
、导入所有需的commongs-logging类:

import org.apache.commons.logging.Log;

import org.apache.commons.logging.LogFactory;

2
、在自己的类中定义一个org.apache.commons.logging.Log类的私有静态类成员:

private final Log log = LogFactory.getLog(getClass());

LogFactory.getLog()
方法的参数使用的是当前类的class

3
、使用org.apache.commons.logging.Log类的成员方法输出日志信息:

if (log.isDebugEnabled())

{

log.debug("111");

}

if (log.isInfoEnabled())

{

log.info("222");

}

if (log.isWarnEnabled())

{

log.warn("333");

}

if (log.isErrorEnabled())

{

log.error("444");

}

if (log.isFatalEnabled())

{

log.fatal("555")

}
 
LOG4JLOG4J的使用
送给自己的生日礼物,用了很长时间了,还没有个比较详细的了解(420就写了这么多。。。本来想再补充一些,但是。。。。太懒了。。哈哈)

一 最好与commons-logging一起用,why

  1.
标准接口,即使将来脱离了log4j也一样用
  2.
简化了编码,减少耦合度:不需在代码中指定log4j配制文件位置,代码中不需要引用log4j的包
  3.
基本所有框架都是这么用的。。。。。。(我相信群众)

 
附加提供一下commons-logging寻找配置文件的顺序(从别人那抄的)
    1)
首先在classpath下寻找自己的配置文件commons-logging.properties,如果找到,则使用其中定义的Log实现类;
    2)
如果找不到commons-logging.properties文件,则在查找是否已定义系统环境变量org.apache.commons.logging.Log,找到则使用其定义的Log实现类;
    3)
否则,查看classpath中是否有Log4j的包,如果发现,则自动使用Log4j作为日志实现类;
    4)
否则,使用JDK自身的日志实现类(JDK1.4以后才有日志实现类);
    5)
否则,使用commons-logging自己提供的一个简单的日志实现类SimpleLog


二 具体实现

  1.
commons-loggingjar加到classpath
  2.
log4jjar加到classpath
  3.
classpath的根目录下,建立log4j.properties(必须是这个地方,必须叫这个名,才不用特殊配置),可以直接复制后边的模板
  4.
在需要log的类中:
      import org.apache.commons.logging.Log;
      import org.apache.commons.logging.LogFactory;

      private static Log log = LogFactory.getLog(xxxx.class);
       
为什么要使用static?因为避免产生多个实例
       
为什么不使用this.class?因为是static不能用this(我经常犯这个错误。。。)
       
为什么不使new XXXX().getClass()?因为。。。。你猜呢?
  5.
根据实际需要log.debug()log.info()log.warn()log.error()log.fatal()  就可以输出不同等级的log


log的等级

  1.
为什么需要等级?写代码的时候可能需要很多调试信息,运行的时候可能需要显示提示信息,如果在服务器上发生严重错误的时候,可能需要给管理员发邮件。这种:调试,提示,错误就是等级。
  2.
都有什么等级? 调试(DEBUG)<信息(INFO)<警告(WARN)<错误(ERROR)<致命错误(FATAL)
  3.
怎么用?       log.debug() log.info() log.warn() log.error() log.fatal()依次对应上边的等级


log4j的配制

1.
基本参数解释:
 
全局配制
    log4j.rootLogger = [ level ] , appenderName, appenderName,..........appenderName
    ★log4j.rootLogger
的意思可以理解为:根log或者所有的log
    ★level
就是输出级别,只能设置一个值。
     -
关于等级,前边已经说过了有5种,他们之间的关系可以理解为:
       
调试(DEBUG):包含调试(DEBUG)、信息(INFO)、警告(WARN)、错误(ERROR)、致命错误(FATAL)
       
信息(INFO):包含信息(INFO)、警告(WARN)、错误(ERROR)、致命错误(FATAL)
       
警告(WARN):包含警告(WARN)、错误(ERROR)、致命错误(FATAL)
       
错误(ERROR):包含错误(ERROR)、致命错误(FATAL)
       
致命错误(FATAL):只有他自己
       
这样,如果log4j.rootLogger = INFO,那么 INFOWARNERRORFATAL就全部会被输出
       
如果log4j.rootLogger = ERROR,那么ERRORFATAL就全部会被输出
    ★appenderName
就是记录的目标,目标可以多个,中间用『,』分割,appenderName是自己定义的,换句话说,名字是随便起的,起了名之后,就需要在下边设定具体配制
   
总结一下这部分,比如说有这么一句log4j.rootLogger = INFO , F1,F2那么就以为着要将所有INFOWARNERRORFATALlog全部输出到F1F2上。F1F2是什么?往下看。。。。
 
具体配制
    log4j.appender.F1=org.apache.log4j.ConsoleAppender
    log4j.appender.F1.layout=org.apache.log4j.PatternLayout
    log4j.appender.F1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n
    ★log4j.appender.F1=org.apache.log4j.ConsoleAppender
的意思就是:将F1设置为控制台输出
     -
还可以设置成什么?
        org.apache.log4j.ConsoleAppender
(控制台),
        org.apache.log4j.FileAppender
(文件),
        org.apache.log4j.DailyRollingFileAppender
(每天产生一个日志文件),
        org.apache.log4j.RollingFileAppender
(文件大小到达指定尺寸的时候产生一个新的文件),
        org.apache.log4j.WriterAppender
(将日志信息以流格式发送到任意指定的地方)
    ★log4j.appender.F1.layout=org.apache.log4j.PatternLayout
的意思就是:将F1的输出布局设置为自定义输出布局。
     -
还可以设置成什么?
        org.apache.log4j.HTMLLayout
(以HTML表格形式布局)
        org.apache.log4j.xml.XMLLayout
(以XML形式布局)
        org.apache.log4j.PatternLayout
(可以灵活地指定布局模式),
        org.apache.log4j.SimpleLayout
(包含日志信息的级别和信息字符串),
        org.apache.log4j.TTCCLayout
(包含日志产生的时间、线程、类别等等信息)
    ★log4j.appender.F1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n
既然上边定义的是自定义输出布局,那么就要定义一下具体输出什么样了~~上边的%c %p %m 等以%开头的都是模式字符串,除了模式字符串外[]-空格等这些字符会按照原样显示。
     -
模式字符串解释:
        %m:
消息本身
        %p:
消息的级别INFOWARNERROR。。。
        %r:
从程序开始执行到当前日志产生时的时间间隔(微秒)
        %c:
输出当前日志动作所在的category名称。例如:如果category名称是"a.b.c","%c{2}"将会输出"b.c". {2}意谓着输出"以点分隔开的category名称的后两个组件",如果 {n}没有,将会输出整个category名称.
        %t:
输出当前线程的名称
        %x:
输出和当前线程相关联的NDC,尤其用到像java servlets这样的多客户多线程的应用中。
        %n:
输出平台相关的换行符。
        %%:
输出一个"%"字符
        %d:
输出日志产生时候的日期,当然可以对日期的格式进行定制。例如:%d{HH:mm:ss,SSSS}或者是%d{dd MMM yyyy HH:mm:ss,SSSS},如果没有指定后面的格式,将会输出ISO8601的格式。
        %l:
输出位置信息,相当于%C.%M(%F:%L)的组合。
        %C:
输出日志消息产生时所在的类名,如果类名是"test.page.Class1"%C{1}表示输出类名"Class1",%C{2}输出"page.Class1",%C则输出"test.page.Class1"
        %M:
输出日志消息产生时的方法名称
        %F:
输出日志消息产生时所在的文件名称
        %L:
输出代码中的行号
     -
可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。如:
        1)%20c
:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,默认的情况下右对齐。
        2)%-20c:
指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,"-"号指定左对齐。
        3)%.30c:
指定输出category的名称,最大的宽度是30,如果category的名称大于30的话,就会将左边多出的字符截掉,但小于30的话也不会有空格。
        4)%20.30c:
如果category的名称小于20就补空格,并且右对齐,如果其名称长于30字符,就从左边交远销出的字符截掉。
   
总结一下,现在来我们所配制的F1的全部内容
    -
我们把它配制成了屏幕输出
    -
输出的布局为:自定义布局
    -
我们又定义了自定义布局的格式:日期时间(格式为:yyyy-MM-dd HH:mm:ss,SSS[产生该日志的包名类名方法名] [等级] 信息+回车
   
如果想配制F2为每天产生一个日志文件,并且保存为xml,就这么写:
    log4j.appender.F2=org.apache.log4j.DailyRollingFileAppender
    log4j.appender.F2.layout=org.apache.log4j.xml.XMLLayout
   
这样就可以了吗?当然不是,既然保存为文件。。至少要指定一个文件名吧
    log4j.appender.F2.File=c:/logs/log.xml
   
可以了吗?可以运行了。。。但是。。既然每天都产生一个文件,那么前一天的怎么办呢?
    log4j.appender.F2.DatePattern=yyyyMMdd'.xml.back'
   
这样log4j会在第一次产生今天的log的同时,将昨天的log备份为 log文件名.扩展名yyyyMMdd.xml.back。对应我们这个文件,今天的log到明天有新log产生的时候,就会变为log.xml20070420.xml.back
   
这样的参数到底有多少?常用的有:
    ★ConsoleAppender
选项
     - Threshold=WARN:
指定日志消息的输出最低层次。
     - ImmediateFlush=true:
默认值是true,意谓着所有的消息都会被立即输出。
     - Target=System.err
:默认情况下是:System.out,指定输出控制台
    ★FileAppender
选项
     - Threshold=WARN:
指定日志消息的输出最低层次。
     - ImmediateFlush=true:
默认值是true,意谓着所有的消息都会被立即输出。
     - File=mylog.txt:
指定消息输出到mylog.txt文件。
     - Append=false:
默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
    ★RollingFileAppender
选项
     - Threshold=WARN:
指定日志消息的输出最低层次。
     - ImmediateFlush=true:
默认值是true,意谓着所有的消息都会被立即输出。
     - File=mylog.txt:
指定消息输出到mylog.txt文件。
     - Append=false:
默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
     - MaxFileSize=100KB:
后缀可以是KB, MB 或者是 GB. 在日志文件到达该大小时,将会自动滚动,即将原来的内容移到mylog.log.1文件。
     - MaxBackupIndex=2:
指定可以产生的滚动文件的最大数。
    ★DailyRollingFileAppender
选项
     - Threshold=WARN:
指定日志消息的输出最低层次。
     - ImmediateFlush=true:
默认值是true,意谓着所有的消息都会被立即输出。
     - File=mylog.txt:
指定消息输出到mylog.txt文件。
     - Append=false:
默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
     - DatePattern='.'yyyy-ww:
每周滚动一次文件,即每周产生一个新的文件。当然也可以指定按月、周、天、时和分。即对应的格式如下:
       1)'.'yyyy-MM:
每月
       2)'.'yyyy-ww:
每周
       3)'.'yyyy-MM-dd:
每天
       4)'.'yyyy-MM-dd-a:
每天两次
       5)'.'yyyy-MM-dd-HH:
每小时
       6)'.'yyyy-MM-dd-HH-mm:
每分钟
    ★PatternLayout
选项
     - ConversionPattern=%m%n :
指定怎样格式化指定的消息。
    ★HTMLLayout
选项
     - LocationInfo=true:
默认值是false,输出java文件名称和行号
     - Title=my app file:
默认值是 Log4J Log Messages.
    ★XMLLayout
选项
     - LocationInfo=true:
默认值是false,输出java文件和行号
   
现在来看一下我们完整的第一个配制文件:
========================================================================================
log4j.rootLogger = INFO,F1,F2

log4j.appender.F1=org.apache.log4j.ConsoleAppender
log4j.appender.Threshold=DEBUG
log4j.appender.F1.Target=System.out
log4j.appender.F1.layout=org.apache.log4j.PatternLayout
log4j.appender.F1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n

log4j.appender.F2=org.apache.log4j.DailyRollingFileAppender
log4j.appender.F2.File=c:/logs/log.xml
log4j.appender.F2.DatePattern=yyyyMMdd-HH'.xml.back'
log4j.appender.F2.layout=org.apache.log4j.xml.XMLLayout
========================================================================================
   
编段代码看看效果
========================================================================================
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class Main{
    private static Log log = LogFactory.getLog(Main.class);
    public static void main(String[] args) throws Exception{
        log.info("info");
        log.debug("debug");
        log.warn("warn");
        log.error("error");
    }

}
========================================================================================
   
运行效果
========================================================================================
2007-04-20 12:36:22,531 [cn.yyun.test.Main]-[INFO] info
2007-04-20 12:36:22,531 [cn.yyun.test.Main]-[WARN] warn
2007-04-20 12:36:22,531 [cn.yyun.test.Main]-[ERROR] error
========================================================================================
   
并且在c:/logs/下有log.xml生成,里边的内容为:
========================================================================================
<log4j:event logger="cn.yyun.test.Main" timestamp="1177043782531" level="INFO" thread="main">
<log4j:message><![CDATA[info]]></log4j:message>
</log4j:event>

<log4j:event logger="cn.yyun.test.Main" timestamp="1177043782531" level="WARN" thread="main">
<log4j:message><![CDATA[warn]]></log4j:message>
</log4j:event>

<log4j:event logger="cn.yyun.test.Main" timestamp="1177043782531" level="ERROR" thread="main">
<log4j:message><![CDATA[error]]></log4j:message>
</log4j:event>
========================================================================================
   
仔细看一下会发现,虽然我们在代码里写了log.debug("debug")但是debug并没有出现在log中,这是因为我们配置文件中,定义了log的等级为INFOdebug的等级小于info,所以不会显示,而warnerror的大于info,所以也会被显示出来


2.
根据package生成不同的log文件
 
配置
    log4j.logger.cn.yyun.test.abc=INFO,abc2,abc1

    log4j.appender.abc2=org.apache.log4j.ConsoleAppender
    log4j.appender.abc2.layout=org.apache.log4j.PatternLayout
    log4j.appender.abc2.layout.ConversionPattern=abc:[%p] %m%n

    log4j.appender.abc1=org.apache.log4j.DailyRollingFileAppender
    log4j.appender.abc1.File=C:/logs/abc.log
    log4j.appender.abc1.DatePattern='.'yyyyMMdd
    log4j.appender.abc1.layout=org.apache.log4j.PatternLayout
    log4j.appender.abc1.layout.ConversionPattern=%d %r [%t] %5p - %m%n

    log4j.logger.cn.yyun.test.def=INFO,def
    log4j.appender.def=org.apache.log4j.ConsoleAppender
    log4j.appender.def.layout=org.apache.log4j.PatternLayout
    log4j.appender.def.layout.ConversionPattern=def: [%p] %m%n

   
logger.cn.yyun.test.abc换成需要的package就可以了(整个log4j配制文件中只有这些就可以了 )。但是这样会有另一个问题,如果cn.yyun.test.Main这个类中,如果有log操作,会报告:log4j:WARN No appenders could be found for logger (cn.yyun.test.Main).所以要加上log4j.rootCategory=INFO,F1  这样所有的log都会被纪录了。。但是这样又做之后:cn.yyun.test.def里的log,会同时出现在defF1中,cn.yyun.test.abc里的log,会同时出现在abc1abc2F1中。。。。。所以定义的时候一定要规划好。
 
制定packagelog等级
    log4j.logger.org.hibernate=DEBUG


log4j.properties
文件

#### Use two appenders, one to log to console, another to log to a file
#log4j.rootLogger = info, stdout, R
log4j.rootLogger = info, R ,Console    

#Print only messages of priority WARN or higher for your category
log4j.logger.Log=INFO

#----# First appender writes to console
#log4j.appender.stdout=org.apache.log4j.ConsoleAppender
#log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

# Pattern to output the caller's file name and line number.
#log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n

#----# Second appender writes to a file
log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
log4j.appender.Console=org.apache.log4j.ConsoleAppender
#==============#Internal development
log4j.appender.R.File=E:/Apache Software Foundation/Tomcat 5.0/webapps/test/mylog.log
#==============#Production
#log4j.appender.R.File=/var/log/tomcat4/PostAPI
log4j.appender.R.DatePattern='_'yyyy-MM-dd'.log'

# Control the maximum log file size
#log4j.appender.R.MaxFileSize=100KB
# Archive log files (one backup file here)
#log4j.appender.R.MaxBackupIndex=1

log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%d-[TS] %p %t %c - %m%n
log4j.appender.Console.layout=org.apache.log4j.SimpleLayout

# digester and beanutils puts out an unholy amount of debug information through log4j.
# the following lines disable them
log4j.logger.org.apache.commons.digester.Digester=info
log4j.logger.org.apache.commons.beanutils.MethodUtils=info
log4j.logger.org.apache.commons.beanutils.BeanUtils=info
log4j.logger.org.apache.commons.beanutils.ConvertUtils=info


测试类:

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.log4j.PropertyConfigurator;
import java.io.File;

public class MyLog4j {
   
    static Log log = LogFactory.getLog(MyLog4j.class);

       public static void log(){
          File flog = new File("");       //  current directory
          String path = flog.getAbsolutePath();      //  path = "E:/Apache Software Foundation/Tomcat 5.0/webapps/test";
          PropertyConfigurator.configure(path + "/log4j.properties");        // 
加载.properties文件

              log.debug("Debug info.");
              log.info("Info info");
              log.warn("Warn info");
              log.error("Error info");
              log.fatal("Fatal info");

       }

       public static void main(String[] args) {
              MyLog4j test = new MyLog4j();
              test.log();
       }
  }

 

XML

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration   xmlns:log4j='http://jakarta.apache.org/log4j/'>

<!-- org.apache.log4j.ConsoleAppender
(输出到控制台),
     org.apache.log4j.FileAppender   
(输出到文件),
     org.apache.log4j.DailyRollingFileAppender
  
(每天输出产生一个日志文件),
     org.apache.log4j.RollingFileAppender
              
(文件大小到达指定尺寸的时候产生一个新的文件),
               
可通过 log4j.appender.R.MaxFileSize=100KB 设置文件
               
大小,还可通过 log4j.appender.R.MaxBackupIndex=1
               
设置为保存一个备份文件。
     org.apache.log4j.WriterAppender
              
(将日志信息以流格式发送到任意指定的地方) -->
     
     
<!--
输出通道"STDOUT",输出所有信息到控制台
              
(也就是System.out.println() -->
<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
 <!--org.apache.log4j.HTMLLayout   
(以 HTML 表格形式布局),
  org.apache.log4j.PatternLayout
(可以灵活地指定Log内容布局模式),
  org.apache.log4j.SimpleLayout 
(包含日志信息的级别和信息字符串),
  org.apache.log4j.TTCCLayout  

                    
(包含日志产生的时间、线程、类别等等信息) -->
 <!--
输出自定义内容的LOG -->
 <layout   class="org.apache.log4j.PatternLayout">
  <!--
   %m
输出代码中指定的消息
   %p
输出优先级,即 DEBUG INFO WARN ERROR FATAL
   %r
输出自应用启动到输出该 log 信息耗费的毫秒数
   %c
输出打了Log的类名,%c{1}从类名开始输出一个,

     
例如com.tongshida.Action{1}时只输出Action,

          {2}
输出 tongshida.Action
   %C
输出.Error()方法所在的类。
   %M
输出生成LOG的类当中的方法名称
   %t
输出产生该日志事件的线程名
   %n
输出一个回车换行符, Windows 平台为 "rn",Unix 平台为 "n"
   %d
输出日志时间点的日期或时间,默认格式为 ISO8601 ,也可以在

     
其后指定格式,比如: %d{yyyy MMM dd HH:mm:ss,SSS} ,输出类似:

      2002 10 18
22 10 28 921
   %l
输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中

     
的行数。
   %[
数值]p 输出的%p字符串长度小于[数值]时,补空格,默认右对齐,

     
前加-号,左对齐,这里也可以是%m等别的
   %.[
数值]p输出的%p字符串长度大于[数值],后面切掉。
   %[
数值].[数值]p 就是综合上两行。
   -->
  <!--
输出时Log内容的具体定义 -->
  <param name="ConversionPattern"

     value="[%d{yyyy-MM-dd HH:mm:ss,SSS}][%-20c{1}]%-5p - %m%n"/>
 </layout>
</appender>

<!--
输出通道"DEBUG",输出方式是:只输出DEBUG级别的LOG,并文件

     
大小到达指定大小时产生新的Log文件 -->
<appender name="DEBUG" class="org.apache.log4j.RollingFileAppender">
 <!--
输出Log文件的路径和文件名 -->
 <param name="File" value="logs/debug/debug.log"/>
 <!-- TOMCAT
WEB服务器重新启动时,是否插入到原有的LOG文件里,

      true
插入false 新建 -->
 <param name="Append" value="true"/>

 <!--
只输出定义的级别以上的LOG,因为在下面过滤LOG信息所以屏蔽 -->
 <!-- param name="Threshold" value="info"/ -->
 
 <!--
因选择了RollingFileAppender了才有下面两个 MaxFileSize

      MaxBackupIndex
选项 -->
 <!-- MaxFileSize
是一个LOG文件的最大的文件大小,当LOG文件超过这个

     
值时,自动转成 *.log.1LOG文件 -->
 <param name="MaxFileSize" value="1024KB"/>
 <!-- MaxBackupIndex
生成自动转成 *.log.1LOG文件的个数,设置3时最多

     
生成3LOG备份文件,它们是[*.log.1][*.log.2][*.log.3] -->
 <param name="MaxBackupIndex" value="2"/>
 <!--
输出时Log内容的具体定义 -->
 <layout class="org.apache.log4j.PatternLayout">
  <param name="ConversionPattern"

        value="[%d{yyyy-MM-dd HH:mm:ss,SSS}][%-20c{1}]%-5p - %m%n"/>
 </layout>
 <!--
过滤输出时Log内容,在这里,LevelMinLevelMax都定义了DEBUG

       
所以只输出DEBUG级别LOG的数据 -->
 <filter class="org.apache.log4j.varia.LevelRangeFilter">
  <!--
指定输出LOG内容的最低等级 -->
  <param name="LevelMin" value="DEBUG"/>
  <!--
指定输出LOG内容的最高等级 -->
  <param name="LevelMax" value="DEBUG"/>
 </filter>
</appender>

<!--
输出通道"INFO",输出方式是:只输出INFO级别的LOG,并文件大小
    
到达指定大小时产生新的Log文件 -->
<appender name="INFO" class="org.apache.log4j.RollingFileAppender">
 <param name="File" value="logs/info/info.log"/>
 <param name="Append" value="true"/>
 <param name="MaxFileSize" value="1024KB"/>
 <param name="MaxBackupIndex" value="2"/>
 <layout class="org.apache.log4j.PatternLayout">
  <param name="ConversionPattern"

      value="[%d{yyyy-MM-dd HH:mm:ss,SSS}][%-20c{1}]%-5p - %m%n"/>
 </layout>
 <filter   class="org.apache.log4j.varia.LevelRangeFilter">
  <param name="LevelMin" value="INFO"/>
  <param name="LevelMax"   value="INFO" />
 </filter>
</appender>

<!--
输出通道"WARN",输出方式是:只输出WARN级别的LOG,并文件
    
大小到达指定大小时产生新的Log文件 -->
<appender name="WARN" class="org.apache.log4j.RollingFileAppender">
 <param   name="File" value="logs/warn/warn.log"/>
 <param name="Append" value="true"/>
 <param name="MaxFileSize" value="500KB"/>
 <param name="MaxBackupIndex" value="2"/>
 <layout class="org.apache.log4j.PatternLayout">
  <param name="ConversionPattern"

      value="[%d{yyyy-MM-dd HH:mm:ss,SSS}][%-20c{50}]%-5p - %m%n"/>
 </layout>
 <filter class="org.apache.log4j.varia.LevelRangeFilter">
  <param name="LevelMin" value="WARN"/>
  <param name="LevelMax" value="WARN"/>
 </filter>
</appender>

<!--
输出通道"ERROR",输出方式是:只输出ERROR级别的LOG,并文件
    
大小到达指定大小时产生新的Log文件 -->
<appender name="ERROR" class="org.apache.log4j.RollingFileAppender">
 <param name="File" value="logs/error/error.log"/>
 <param name="Append" value="true"/>
 <param name="MaxFileSize" value="500KB"/>
 <param name="MaxBackupIndex" value="2"/>
 <layout class="org.apache.log4j.PatternLayout">
  <param name="ConversionPattern"
       value="[%d{yyyy-MM-dd HH:mm:ss,SSS}][%-20c]%-5p - %m%n"/>
 </layout>
 <filter class="org.apache.log4j.varia.LevelRangeFilter">
  <param name="LevelMin" value="ERROR"/>
  <param name="LevelMax" value="ERROR"/>
 </filter>
</appender>

<!--
输出通道"FATAL",输出方式是:只输出FATAL级别的LOG,并文件大小
    
到达指定大小时产生新的Log文件 -->
<appender name="FATAL" class="org.apache.log4j.RollingFileAppender">
 <param name="File" value="logs/fatal/fatal.log"/>
 <param name="Append" value="true"/>
 <param name="MaxFileSize" value="500KB"/>
 <param name="MaxBackupIndex" value="2"/>
 <layout class="org.apache.log4j.PatternLayout">
  <param name="ConversionPattern"
       value="[%d{yyyy-MM-dd HH:mm:ss,SSS}][%-20c{100}]%-5p - %m%n"/>
 </layout>
 <filter class="org.apache.log4j.varia.LevelRangeFilter">
  <param name="LevelMin" value="FATAL"/>
  <param name="LevelMax" value="FATAL"/>
 </filter>
</appender>

<!--
输出通道"ALL",输出方式是:输出所有级别的LOG,并文件大小到达
    
指定大小时产生新的Log文件 -->
<appender name="ALL" class="org.apache.log4j.RollingFileAppender">
 <param name="File" value="logs/all/all.log"/>
 <param name="Append" value="true"/>
 <param name="MaxFileSize" value="500KB"/>
 <param name="MaxBackupIndex" value="2"/>
 <layout class="org.apache.log4j.PatternLayout">
  <param name="ConversionPattern"

      value="[%d{yyyy-MM-dd HH:mm:ss,SSS}][%-20c{1}]%-5p - %m%n"/>
 </layout>
 <filter class="org.apache.log4j.varia.LevelRangeFilter">
  <param name="LevelMin" value="DEBUG"/>
  <param name="LevelMax" value="FATAL"/>
 </filter>
</appender>

<!--
输出通道"EVERYDAY",输出方式是:输出指定所有级别的LOG,并每天一个
    
日志文件 -->
<appender name="EVERYDAY" class="org.apache.log4j.DailyRollingFileAppender">
 <param name="File" value="logs/ereryday/ereryday.log"/>
 <param name="Append" value="true"/>
    <!-- param name="Threshold"   value="DEBUG"/ --> 
 <!--
以日为单位输出LOG文件,每日输出一个LOG文件-->
 <param name="DatePattern" value="'.'yyyy-MM-dd"/>
 <!--
以时为单位输出LOG文件,每小时输出一个LOG文件
 <param name="DatePattern" value="'.'yyyy-MM-dd-HH"/>
 -->
 <layout class="org.apache.log4j.PatternLayout">
  <!-- The default pattern: Date Priority [Category] Message -->
  <param name="ConversionPattern"

   value="[%d{yyyy-MM-dd HH:mm:ss,SSS}][%-20c{100}]%-5p - %m%n"/>
  <!-- The full pattern: Date MS Priority [Category] (Thread:NDC)
       Message <param name="ConversionPattern"
       value="%d %-5r %-5p [%c] (%t:%x) %m%n"/>
  -->
 </layout>
 <!--
过滤输出时Log内容,在这里,LevelMinDEBUGLevelMaxFATAL
     
所以输出DEBUG级别到FATAL级别的LOG数据 -->
 <filter class="org.apache.log4j.varia.LevelRangeFilter">
  <param name="LevelMin" value="DEBUG"/>
  <param name="LevelMax" value="FATAL"/>
 </filter>
</appender>

<!--
输出通道"DATABASE",输出方式是:输出所有级别的LOG到数据库 (liu:我没用过,谁有机会试试,这个对日志管理很有用,可以开发一个日志查看系统来统一管理好多系统的日志)-->
<appender name="DATABASE" class="org.apache.log4j.jdbc.JDBCAppender">
        <!--
数据库的驱动,这里用的是MSSQL-->
        <param name="driver" value="com.microsoft.jdbc.sqlserver.SQLServerDriver"/>
  <!--
这是Oracle用的驱动,在这里用MSSQL所以屏蔽掉了
     <param name="driver" value="oracle.jdbc.driver.OracleDriver" />
  -->     <!--
要连接的数据库-->
        <param name="URL"
                  value="jdbc:microsoft:sqlserver://192.168.0.120:
                  1433;DatabaseName=test" />
       <!--
连接数据库的用户名-->
        <param name="user" value="sa" />
      <!--
连接数据库的密码--> 
        <param name="password" value="sa" />
      <!--
MSSQL数据库表LOG中插入数据的sql语句-->
        <param name="sql" value=" INSERT INTO LOG
           (LOGDATE,LOGLEVEL,LOGCLASS,LOGLOGGER,LOGMESSAGE)
           values ('%d{yyyy-MM-dd HH:mm:ss}','%.50p', '%.50c',
                   '%.50l', '%.1000m')"/>
  <!-- Oracle
insert 语句
        <param name="sql" value=" insert into logrecord
       (id,packageid,userid,syscodeid,info,logtime,loglevel)
       values(?,?,?,?,?,to_date('%d{yyyy-MM-dd HH:mm:ss}',
       'yyyy-MM-dd HH24:mi:ss'),'%p')" />
  -->
  <!--
过滤输出时Log内容,在这里,LevelMinERRORLevelMax
       FATAL
,所以输出DEBUG级别到FATAL级别的LOG数据 -->
  <filter class="org.apache.log4j.varia.LevelRangeFilter">
   <param name="LevelMin" value="ERROR"/>
   <param name="LevelMax" value="FATAL"/>
  </filter>
 </appender>
 
<!--
输出通道"HTML",输出方式是:输出所有级别的LOG到数据库 -->
<appender name="HTML" class="org.apache.log4j.RollingFileAppender">
 <param name="File" value="logs/html/htmllog.html" />
 <param name="Append" value="true" />
 <!--
只输出定义的级别以上的LOG,因为在下面过滤LOG信息所以屏蔽 -->
 <!-- param name="Threshold" value="info"/ -->
 <param name="MaxFileSize" value="50KB"/>
 <param name="MaxBackupIndex" value="2"/>
 <!--
好像现在只有固定输出格式 -->
 <!--
输出的HTML都缺少</table></body>等代码,log4jBug(liu :没有实践过,不知道准不准啊)
     
我建议是不要使用 --> 
 <layout class="org.apache.log4j.HTMLLayout">
  <param name="Title" value="TSD HP HTML LOG" />
 </layout>
 <filter class="org.apache.log4j.varia.LevelRangeFilter">
  <param name="LevelMin" value="DEBUG"/>
  <param name="LevelMax" value="FATAL"/>
 </filter>
</appender>

<!--
设置域名限制,即com.tongshida域及以下的日志均输出到下面
    
对应的通道中,liu :原文这样写的,但是好像是将定义包中的类日志输出到不同的日志文件中,我比较倾向于这个)
    
虽然下面<root><priority value="ERROR">设置
    
ERROR,但com.tongshida下面的程序中的LOG要输出
     level="DEBUG"
DEBUG级别以上的LOG-->
<!--
给客户交货时要把它屏蔽-->
<logger name="com.netease.foa">
 <!--
设置com.tongshida以下函数输出LOG的级别 -->
 <level value="DEBUG"/>
 <!--
好像是指定输出通道,因为下面root里指定了所以这里屏蔽掉了
 <appender-ref ref="DEBUG"/>
 -->
</logger>

<root>
 <!--
设置输出范围,在这里光输出ERROR以上的,ERROR级别,
      FATAL
级别的LOG ,如果使用过滤器,就不要设置,直接使用下面的输出通道的ref-->
 <priority value="ERROR"/>
 <!--
上边设置的输出通道,使用啥在这里定义啥,下面是都定义出来的输出通道 -->
 <appender-ref ref="STDOUT"/>
 <appender-ref ref="DEBUG"/>
 <appender-ref ref="INFO"/>
 <appender-ref ref="WARN"/>
 <appender-ref ref="ERROR"/>
 <appender-ref ref="FATAL"/>
 <appender-ref ref="ALL"/>
 <appender-ref ref="EVERYDAY"/>
 <appender-ref ref="DATABASE"/>
 <appender-ref ref="HTML"/>
</root>
</log4j:configuration>

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值