空间站

北极心空

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  15 Posts :: 393 Stories :: 160 Comments :: 0 Trackbacks

Log4j中文手册下载地址http://www.matrix.org.cn/resource/upload/forum/2006_04_07_205056_ZCxoePRlHJ.pdf

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
#
发件人
log4j.appender.MAIL.From=webmaster@bcxy.com
#
发送邮件的服务器
log4j.appender.MAIL.SMTPHost=smtp.163.com
#
邮件的标题
log4j.appender.MAIL.Subject=Log4J Message
#
日志邮件的接收者
log4j.appender.MAIL.To=ezerg@126.com
#
日志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 = corlin@cybercorlin.net

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 芦苇 阅读(5919) 评论(3)  编辑  收藏 所属分类: JAVA其他

Feedback

# re: log4j和commons.logging日志记录的使用方法 2008-03-11 14:08 芦苇
模式字符串简介:
  %c:Category名称。还可以使用%c{n}的格式输出Category的部分名称,其中n为正整数,输出时会从Category名称的右侧起查n个".",然后截取第n个"."右侧的部分输出,例如Category的名称为"x.y.z",指定格式为"%c{2}",则输出"y.z"。
  %C:输出信息时Category所在类的名称,也可以使用%C{n}的格式输出。
  %d:输出信息的时间,也可以用%d{FormatString}的格式输出,其中FormatString的值请参考TTCCLayout的setDateFormat方法,但NULL和RELATIVE在%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-logging的jar加到classpath中
2.把log4j的jar加到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,那么 INFO,WARN,ERROR,FATAL就全部会被输出
如果log4j.rootLogger = ERROR,那么ERROR,FATAL就全部会被输出
★appenderName就是记录的目标,目标可以多个,中间用『,』分割,appenderName是自己定义的,换句话说,名字是随便起的,起了名之后,就需要在下边设定具体配制
总结一下这部分,比如说有这么一句log4j.rootLogger = INFO , F1,F2那么就以为着要将所有INFO,WARN,ERROR,FATAL的log全部输出到F1,F2上。F1,F2是什么?往下看。。。。
⑵具体配制
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:消息的级别INFO,WARN,ERROR。。。
%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的等级为INFO,debug的等级小于info,所以不会显示,而warn,error的大于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,会同时出现在def和F1中,cn.yyun.test.abc里的log,会同时出现在abc1,abc2和F1中。。。。。所以定义的时候一定要规划好。
⑵制定package的log等级
log4j.logger.org.hibernate=DEBUG


  回复  更多评论
  

# re: log4j和commons.logging日志记录的使用方法 2008-03-11 14:09 芦苇
经过测试的log4j.properties文件---用于数据库的log
log4j.rootLogger = DEBUG,DATABASE

log4j.appender.DATABASE = org.apache.log4j.jdbc.JDBCAppender
log4j.appender.DATABASE.Driver = oracle.jdbc.driver.OracleDriver
log4j.appender.DATABASE.URL = jdbc:oracle:thin:@192.168.8.2:1521:dssdb
log4j.appender.DATABASE.User = tom
log4j.appender.DATABASE.Password = lizhifeng
log4j.appender.DATABASE.layout = org.apache.log4j.PatternLayout
log4j.appender.DATABASE.layout.ConversionPattern = INSERT INTO log4j (createDate, thread, priority, category, message) values(sysdate, '%t', '%-5p', '%c', '%m')
  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: