深入log4J和commons-logging

log4j的好处在于:
1.通过修改配置文件,就可以决定log信息输出到何处(console,文件,...),是否输出。
这样,在系统开发阶段可以打印详细的log信息以跟踪系统运行情况,而在系统稳定后可以关闭log输出,从而在能跟踪系统运行情况的同时,又减少了垃圾代码(System.out.println(...)等)。
2.使用log4j,需要整个系统有一个统一的log机制,有利于系统的规划。

当你在开发程序的时候, 调试(debugging)和日志(logging)都是非常重要的工作, 但是, 现在有太多的 logging API 问世, 因为他们都不错, 很难做一个抉择. 国外 java 论坛对于这些logging 方式也是有一番讨论.

而 common logging 就是一个在这几个不同的 logging API 中建立小小的桥梁.目前在 Java 中最有名的 Log 方式, 首推是 Log4j, 另是 JDK 1.4 Logging API. 除此之外, 还有 Avalon中用的 LogKit 等等 . 而 commons-logging 也有实现一些基本 的 logging 方式为 NoOpLog 及 SimpleLog. 对于他们的比较不在这次讨论范围,

有兴趣者请自行参阅参考文件.

快速使用 Logging 其实 logging 非常简单去使用, 将 commons-logging.jar 放到 /WEB-INF/lib 之下.接著写以下的代码

LoggingTest.java

package com.softleader.newspaper.java.opensource;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class LoggingTest {

Log log = LogFactory.getLog(LoggingTest.class);

public void hello() {
log.error("ERROR");
log.debug("DEBUG");
log.warn("WARN");
log.info("INFO");
log.trace("TRACE");
System.out.println("OKOK");
}

}

在 / 放置一个 jsp 测试 test-commons-logging.jsp

<%@ page import="com.softleader.newspaper.java.opensource.LoggingTest" %>
<% LoggingTest test = new LoggingTest(); test.hello();%>

你将会看到 tomcat console 会有下面输出

log4j:WARN No appenders could be found for logger (com.softleader.newspaper.java.opensource.LoggingTest).
log4j:WARN Please initialize the log4j system properly.OKOK

是因为你还没有配置 commons-logging.properties, 马上会为你介绍 ~~~.

设定 commons-logging.properties 你可以设置你的 log factory 是要使用哪一个 我以 Log4J 为例子 在 /WEB-INF/classes/commons-logging.properties 中写入
org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JCategoryLog
如果你 server 是使用 jdk1.4 以上的版本
可以使用 org.apache.commons.logging.impl.Jdk14Logger
接著根据你的 Logger 撰写符合他的 properties 拿 Log4j 为例子 你就要在
/WEB-INF/classes/ 下放置一个

//日志输出到文件
log4j.rootLogger=DEBUG, A_default
log4j.appender.A_default=org.apache.log4j.RollingFileAppender
log4j.appender.A_default.File=c://log/test.log
log4j.appender.A_default.MaxFileSize=4000KB
log4j.appender.A_default.MaxBackupIndex=10
log4j.appender.A_default.layout=org.apache.log4j.PatternLayout
log4j.appender.A_default.layout.ConversionPattern=%d{ISO8601} - %p - %m%n

//日志输出到控制台
log4j.rootLogger=INFO, A1
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n

//发送邮件
# Configuration for receiving e-mails when ERROR messages occur.

#自定义的Appender
log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender
#日志的错误级别
log4j.appender.MAIL.Threshold=ERROR
#缓存文件大小,日志达到512K时发送Email
log4j.appender.MAIL.BufferSize=512
#发件人
[email protected]
#发送邮件的服务器
log4j.appender.MAIL.SMTPHost=smtp.163.com
#邮件的标题
log4j.appender.MAIL.Subject=Log4J Message
#日志邮件的接收者
[email protected]
#日志PatternLayout
log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout
#日志的格式
log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n


此时你去执行 test-commons-logging.jsp 输出的内容, 就会记录在你的 c:\log 目录的 test.log 中了 ps:如果没有相关的 class 会使用到 SimpLog, 此时要设定的是
simplelog.properties 结论以我自己本身使用的经验, Log4j 可以满足所有工程师, 所以我也是直接使用 log4j 而没有使用 commons-logging.

不过为了增加产品的通用性, 避免移植时候的麻烦, 新的产品及项目, 我会将他改成 commons-logging api 去调用.

如果你对commons-logging的工作原理不是很了解,请参考<commons-logging的使用方法>

另,mvnforum里面的commons-logging.properties写法:
# This is configuration file which used to config Logging for mvnForum application
# mvnForum supports 2 Loggings: Log4J and jzonic
# Depend on your web server, you should choose a logging properly


# IMPORTANT NOTE FOR TOMCAT 5.x USERS:
#
# By default, Tomcat 5.x will not work with Log4J.
# However, this file (commons-logging.properties) with a line
# config : org.apache.commons.logging.LogFactory=org.apache.commons.logging.impl.Log4jFactory
# make Tomcat 5.x and Log4J work happyly together forever, I dont know why :-)



# Log4J
# This used to config logging Log4J
# Note that by default, common logging will look for Log4J first
# Comment out folling line to if you will use Jlo logging (also remember to enable Jlo below)

org.apache.commons.logging.LogFactory=org.apache.commons.logging.impl.Log4jFactory

# Jlo
# jlo.xml config logging which only log the statements (DEBUG, ERROR, TRACE, INFO, WARN)
# from the packages start with net.myvietnam and com.mvnforum.
# See properities/jlo.xml for detail about this logging
# See http://jzonic.org for documentation
# If you want to extend mvnForum application, you should be aware of that

# Uncomment folling line to choose jlo logging
# You will need Jlo if Log4j could not run on Tomcat 5.0.x, Tomcat 5.5.x or JRun 4
# NOTE: read comment above about Tomcat 5.x issue

# org.apache.commons.logging.LogFactory=org.jzonic.jlo.LogManager

====================================================================

LOG4J的配置之简单使它遍及于越来越多的应用中了:Log4J配置文件实现了输出到控制台、文件、回滚文件、发送日志邮件、输出到数据库日志表、自定义标签等全套功能。择其一二使用就够用了,



log4j.rootLogger=DEBUG,CONSOLE,A1,im
log4j.addivity.org.apache=true



# 应用于控制台

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.CONSOLE.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD] n%c[CATEGORY]%n%m[MESSAGE]%n%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
# Use this layout for LogFactor 5 analysis



# 应用于文件回滚

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=web@www.wuset.com
log4j.appender.MAIL.SMTPHost=www.wusetu.com
log4j.appender.MAIL.Subject=Log4J Message
log4j.appender.MAIL.To=web@www.wusetu.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

#自定义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 = [email protected]

log4j.appender.im.layout=org.apache.log4j.PatternLayout
log4j.appender.im.layout.ConversionPattern =[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n

 

posted on 2008-03-11 11:48 芦苇 阅读(1733) 评论(3)  编辑  收藏 所属分类: JAVA其他

Feedback

# re:log4j和commons.logging日志记录的使用方法 2008-03-11 14:08 芦苇

模式字符串简介:
%cCategory名称。还可以使用%c{n}的格式输出Category的部分名称,其中n为正整数,输出时会从Category名称的右侧起查n".",然后截取第n"."右侧的部分输出,例如Category的名称为"x.y.z",指定格式为"%c{2}",则输出"y.z"
%C:输出信息时Category所在类的名称,也可以使用%C{n}的格式输出。
%d:输出信息的时间,也可以用%d{FormatString}的格式输出,其中FormatString的值请参考TTCCLayoutsetDateFormat方法,但NULLRELATIVE%d中无法使用。
%F:输出信息时Category所在类文件的名称。
%l:输出信息时Category所在的位置,使用"%C.%M(%F:%L)"可以产生同样的效果。
%L:输出信息时Category在类文件中的行号。
%m:信息本身。
%M:输出信息时Category所在的方法。
%n:换行符,可以理解成回车。
%p:日志级别。
%r:输出信息所用的时间,以毫秒为单位。
%t:当前线程。
%x:输出和当前线程相关的NDC信息。
%X:输出与当前现成相关的MDC信息。
%%:输出%
此外,还可以在%与模式字符之间加上修饰符来设置输出时的最小宽度、最大宽度及文本对齐方式,例如:
%30d{DATE}:按当前所在地区显示日期和时间,并指定最小宽度为30,当输出信息少于30个字符时会补以空格并右对齐。
%-30d{DATE}:也是按当前所在地区显示日期和时间,指定最小宽度为30,并在字符少于30时补以空格,但由于使用了"-",因此对齐方式为左对齐,与默认情况一样。
%.40d{DATE}:也是按当前所在地区显示日期和时间,但指定最大宽度为40,当输出信息多于40个字符时会将左边多出的字符截掉。此外,最大宽度只支持默认的左对齐方式,而不支持右对齐。
%30.40d{DATE}:如果输出信息少于30个字符就补空格并右对齐,如果多于40个字符,就将左边多出的字符截掉。
%-30.40d{DATE}:如果输出信息少于30个字符就补空格并左对齐,如果多于40个字符,就将左边多出的字符截掉。
 
回复  更多评论
 

 

# re:log4j和commons.logging日志记录的使用方法 2008-03-11 14:08 芦苇

最好与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-ddHH: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:
默认值是 Log4JLog 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 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章