log4j能不能实现:log4j2 指定配置文件包日志输出到log4j2 指定配置文件文件而不输出到rootLogger,配置如下。

log4j.properties配置详解(转载)
&在强调可重用组件开发的今天,除了自己从头到尾开发一个可重用的日志操作类外,Apache为我们提供了一个强有力的日志操作包 -Log4j。 作为Apache的开源项目,Log4j可以使我们很好的控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、 UNIX
Syslog守护进程等;也可以方便的使我们控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感
兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码
在实际编程时,要使Log4j真正在系统中运行事先还要 对配置文件进行定义。定义步骤就是对Logger、Appender及Layout的分别使用。Log4j支持两种配置文件格式,一种是XML格式的文 件,一种是java properties(key=value)【Java特性文件(键=值)】。(这里只说明properties文件)
-----------------------------------------------------------------------------------------------------------------------------
配置根Logger
其语法为:
log4j.rootLogger = [ level ] , appenderName1, appenderName2,
是日志记录的优先级,分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定义的级别。Log4j建议只使用四个级别,优 先级从高到低分别是ERROR、WARN、INFO、DEBUG。
通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关。比如在这里定 义了INFO级别,则应用程序中所有DEBUG级别的日志信息将不被打印出来。
appenderName:
就是指定日志信息输出到哪个地方。您可以同时指定多个输出目的地。 例 如:log4j.rootLogger=info,A1,B2,C3
--------------------------------------------------------------------------------------------------------------------------------
配置日志信息输出目的地
其语法为:
log4j.appender.appenderName =
fully.qualified.name.of.appender.class //
"fully.qualified.name.of.appender.class" 可以指定下面五个目的地中的一个:
1.org.apache.log4j.ConsoleAppender(控制台)
2.org.apache.log4j.FileAppender(文 件)
3.org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
4.org.apache.log4j.RollingFileAppender(文
件大小到达指定尺寸的时候产生一个新的文件)
5.org.apache.log4j.WriterAppender(将日志信息以流格式发送到
任意指定的地方)
1.ConsoleAppender选项
&Threshold=WARN:指定日志消息的输出最低层次。
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
Target=System.err:默认情况下是:System.out,指定输出控制台
2.FileAppender
Threshold=WARN:指定日志消息的输出最低层次。
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
File=mylog.txt:指定消息输出到mylog.txt文件。
Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
3.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: 每分钟
4.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:指定可以产生的滚动文件的最大数。
--------------------------------------------------------------------------------------------------------------------------------
配置日志信息的格式
其语法为:
1). log4j.appender.appenderName.layout =
fully.qualified.name.of.layout.class
"fully.qualified.name.of.layout.class" 可以指定下面4个格式中的一个:
1.org.apache.log4j.HTMLLayout(以HTML表格形式布局),    2.org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
   3.org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
   4.org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
1.HTMLLayout
LocationInfo=true:默认值是false,输出java文件名称和行号
Title=my app file: 默认值是 Log4J Log Messages.
2.PatternLayout 选项
ConversionPattern=%m%n :指定怎样格式化指定的消息。
3.XMLLayout 选项
LocationInfo=true:默认值是false,输出java文件和行号
2). log4j.appender.A1.layout.ConversionPattern=%-4r %-5p
%d{yyyy-MM-dd HH:mm:ssS} %c %m%n
这里需要说明的就是日志信息格式中几个符号所代表的含义:
X信息输出时左对齐;
%p: 输出日志信息优先级,即DEBUG,INFO,WARN,ERROR,FATAL,
%d: 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日
22:10:28,921
%r: 输出自应用启动到输出该log信息耗费的毫秒数
%c: 输出日志信息所属的类目,通常就是所在类的全名
%t: 输出产生该日志事件的线程名
%l: 输出日志事件的发生位置,相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程,以及在代码中的行数。举 例:Testlog4.main(TestLog4.java:10)
%x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java
servlets这样的多客户多线程的应用中。
%%: 输出一个"%"字符
%F: 输出日志消息产生时所在的文件名称
%L: 输出代码中的行号
%m: 输出代码中指定的消息,产生的日志具体信息
%n: 输出一个回车换行符,Windows平台为"
",Unix平台为"
"输 出日志信息换行
可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。如:
1) c:指定输出 category的名称,最小的宽度是20,如果category的名称小于20的话,默认的情况下右对齐。
2)%-20c:指定输出 category的名称,最小的宽度是20,如果category的名称小于20的话,"-"号指定左对齐。
3)%.30c:指定输出 category的名称,最大的宽度是30,如果category的名称大于30的话,就会将左边多出的字符截掉,但小于30的话也不会有空格。
4) .30c: 如果category的名称小于20就补空格,并且右对齐,如果其名称长于30字符,就从左边交远销出的字符截掉
比较详细的例子
log4j.rootLogger=INFO,consoleAppender,logfile,MAIL
log4j.addivity.org.apache=true
#ConsoleAppender,控制台输出
#FileAppender, 文件日志输出
#SMTPAppender,发邮件输出日志
#SocketAppender,Socket日志
#NTEventLogAppender,Window NT日志
#SyslogAppender,
#JMSAppender,
#AsyncAppender,
#NullAppender
#文件输出:RollingFileAppender
#log4j.rootLogger = INFO,logfile
log4j.appender.logfile = org.apache.log4j.RollingFileAppender
log4j.appender.logfile.Threshold = INFO
# 输出以上的INFO信息
log4j.appender.logfile.File = INFO_log.html
#保存log文件路径
log4j.appender.logfile.Append = true
# 默认为true,添加到末尾,false在每次启动时进行覆盖
log4j.appender.logfile.MaxFileSize = 1MB
# 一个log文件的大小,超过这个大小就又会生成1个日志 # KB
log4j.appender.logfile.MaxBackupIndex = 3
# 最多保存3个文件备份
log4j.appender.logfile.layout = org.apache.log4j.HTMLLayout
# 输出文件的格式
log4j.appender.logfile.layout.LocationInfo = true
#是否显示类名和行数
log4j.appender.logfile.layout.Title
=title:\u63d0\u\uff1a\u7cfb\u7edf\u53d1\u751f\u4e86\u4e25\u91cd\u9519\u8bef
#html页面的 & title &
############################## SampleLayout
####################################
# log4j.appender.logfile.layout =
org.apache.log4j.SampleLayout
############################## PatternLayout
###################################
# log4j.appender.logfile.layout =
org.apache.log4j.PatternLayout
# log4j.appender.logfile.layout.ConversionPattern =% d % p [ % c] -
% m % n % d
############################## XMLLayout
#######################################
# log4j.appender.logfile.layout = org.apache.log4j.XMLLayout
# log4j.appender.logfile.layout.LocationInfo = true
#是否显示类名和行数
############################## TTCCLayout
######################################
# log4j.appender.logfile.layout = org.apache.log4j.TTCCLayout
# log4j.appender.logfile.layout.DateFormat = ISO8601
#NULL, RELATIVE, ABSOLUTE, DATE or ISO8601.
# log4j.appender.logfile.layout.TimeZoneID = GMT - 8 : 00
# log4j.appender.logfile.layout.CategoryPrefixing = false
##默认为true 打印类别名
# log4j.appender.logfile.layout.ContextPrinting = false
##默认为true 打印上下文信息
# log4j.appender.logfile.layout.ThreadPrinting = false
##默认为true 打印线程名
# 打印信息如下:
#2007 - 09 - 13 14 : 45 : 39 , 765 [http - 8080 - 1 ] ERROR
com.poxool.test.test - error成功关闭链接
###############################################################################
#每天文件的输出:DailyRollingFileAppender
#log4j.rootLogger = INFO,errorlogfile
log4j.appender.errorlogfile =
org.apache.log4j.DailyRollingFileAppender
log4j.appender.errorlogfile.Threshold = ERROR
log4j.appender.errorlogfile.File = ../logs/ERROR_log
log4j.appender.errorlogfile.Append = true
#默认为true,添加到末尾,false在每次启动时进行覆盖
log4j.appender.errorlogfile.ImmediateFlush = true
#直接输出,不进行缓存
# ' . ' yyyy - MM: 每个月更新一个log日志
# ' . ' yyyy - ww: 每个星期更新一个log日志
# ' . ' yyyy - MM - dd: 每天更新一个log日志
# ' . ' yyyy - MM - dd - a: 每天的午夜和正午更新一个log日志
# ' . ' yyyy - MM - dd - HH: 每小时更新一个log日志
# ' . ' yyyy - MM - dd - HH - mm: 每分钟更新一个log日志
log4j.appender.errorlogfile.DatePattern = ' . ' yyyy - MM - dd '
#文件名称的格式
log4j.appender.errorlogfile.layout =
org.apache.log4j.PatternLayout
log4j.appender.errorlogfile.layout.ConversionPattern =%d %p [ %c] -
#控制台输出:
#log4j.rootLogger = INFO,consoleAppender
log4j.appender.consoleAppender =
org.apache.log4j.ConsoleAppender
log4j.appender.consoleAppender.Threshold = ERROR
log4j.appender.consoleAppender.layout =
org.apache.log4j.PatternLayout
log4j.appender.consoleAppender.layout.ConversionPattern =%d %-5p %m
log4j.appender.consoleAppender.ImmediateFlush = true
# 直接输出,不进行缓存
log4j.appender.consoleAppender.Target = System.err
# 默认是System.out方式输出
#发送邮件:SMTPAppender
#log4j.rootLogger = INFO,MAIL
log4j.appender.MAIL = org.apache.log4j.net.SMTPAppender
log4j.appender.MAIL.Threshold = INFO
log4j.appender.MAIL.BufferSize = 10
log4j.appender.MAIL.From =
log4j.appender.MAIL.SMTPHost =
log4j.appender.MAIL.Subject = Log4J Message
log4j.appender.MAIL.To =
log4j.appender.MAIL.layout = org.apache.log4j.PatternLayout
log4j.appender.MAIL.layout.ConversionPattern =%d - %c -%-4r [%t]
%-5p %c %x - %m %n
#数据库:JDBCAppender
log4j.appender.DATABASE = org.apache.log4j.jdbc.JDBCAppender
log4j.appender.DATABASE.URL = jdbc:oracle:thin:@ 210.51 . 173.94 :
log4j.appender.DATABASE.driver =
oracle.jdbc.driver.OracleDriver
log4j.appender.DATABASE.user = ydbuser
log4j.appender.DATABASE.password = ydbuser
log4j.appender.DATABASE.sql = INSERT INTO A1 (TITLE3) VALUES ( ' %d
- %c %-5p %c %x - %m%n ' )
log4j.appender.DATABASE.layout =
org.apache.log4j.PatternLayout
log4j.appender.DATABASE.layout.ConversionPattern =% d - % c -%- 4r
[ % t] %- 5p % c % x - % m % n
#数据库的链接会有问题,可以重写 org.apache.log4j.jdbc.JDBCAppender的getConnection()
使用数据库链接池去得链接,可以避免insert一条就链接一次数据库
指定包的日志级别:
. neusoft =DEBUG
指定com.neusoft包下的所有类的等级为DEBUG。
可以把 com.neusoft改为自己项目所用的包名。
.opensymphony.oscache=ERROR
log4j.logger.net.sf.navigator=ERROR
这两句是把这两个包下出现的错误的等级设 为ERROR,如果项目中没有配置EHCache,则不需要这两句。
log4j.logger.mons=ERROR
log4j.logger.org.apache.struts=WARN
这两句是struts的包。
log4j.logger.org.displaytag=ERROR
这句是displaytag的包。(QC问题列表页面所用)
log4j.logger.org.springframework=DEBUG
此句为Spring的包。
log4j.logger.org.hibernate.ps.PreparedStatementCache=WARN
log4j.logger.org.hibernate=DEBUG
此两句是hibernate的包。
以 上这些包的设置可根据项目的实际情况而自行定制。
log4j.additivity是 子Logger 是否继承 父Logger 的 输出源(appender) 的标志位。具体说,默认情况下 子Logger 会继承 父Logger 的appender,也就是说 子Logger 会在 父Logger 的appender里输出。若是additivity设为false,则 子Logger 只会在自己的appender里输出,而不会在 父Logger 的appender里输出。如:
log4j.rootLogger=INFO, stdout,logfile
.ambow.upgrade=INFO, dataSync 则
com.ambow.upgrade包及其子包下的Logger不光在Appender dataSync里输出,也会在rootLogger的Appender stuout和logfile中输出; 若想让 com.ambow.upgrade包及其子包下的Logger只在Appender
dataSync中输出,则在log4j.properties中添加下行即可:
.ambow.upgrade=false
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。leizhimin 的BLOG
用户名:leizhimin
文章数:638
评论数:2523
注册日期:
阅读量:3829
阅读量:2071
阅读量:2942
51CTO推荐博文
4028人学习
Apache通用日志工具commons-logging和Log4j使用总结
在程序开发中,有时候为了跟踪代码的运行情况,需要在程序代码中加入一些打印代码运行情况的日志代码,在早期的C语言中,一般都是用printf()函数来实现这些信息的输出,在Java语言中用System..out.println()来实现控制台信息输出。这种输出的信息功能非常有限,如果要输出到文件,就很麻烦。并且,如果以后想去掉(不再输出)这些信息,还需要手动的一行一行去改。当然,也有一种解决办法可以实现处理这个问题,在Java中,可以这么写:
------------------------------------------------------
package org.lavasoft.test1;
&* File Name:&& LogUtil.java
&* Created by:& IntelliJ IDEA.
&* Copyright:&& Copyright (c)
&* Company:&&&& LavaSoft( )
&* Author:&&&&& leizhimin
&* Modifier:&&& leizhimin
&* Date Time:&&
&* Readme:&&&&& 手动日志工具类
public class LogUtil {
&&& private static boolean logSwitch=& //日志开关,默认为开
&&& public static void log(String smg){
&&&&&&& if(logSwitch){
&&&&&&&&&&& System.out.println(smg);
} ------------------------------------------------------
package org.lavasoft.test1;
&* File Name:&& ManualLogApp.java
&* Created by:& IntelliJ IDEA.
&* Copyright:&& Copyright (c)
&* Company:&&&& LavaSoft( )
&* Author:&&&&& leizhimin
&* Modifier:&&& leizhimin
&* Date Time:&&
&* Readme:&&&&& 手动日志工具测试
public class ManualLogApp {
&&& public static void main(String[] args){
&&&&&&& new ManualLogApp().test();
&&& public void test(){
&&&&&&& LogUtil.log("我在手动打日志,呵呵!");
通过这两个类,就实现一个简单的日志工具。当你不想打印日志的时候,可以在LogUtil中改logSwitch的值为flase,那么日志打印功能就关闭了。如果你愿意,你可以将这个开关放到一个配置文件中去修改。还可以让日志打印到文件,但是当你修改实现这个功能的时候,这个日志工具会变得相当的复杂。
为了解决上面的问题,Apache针对不同的语言平台为做了一系列日志工具包,可应用于java、.net、php、c++,这些日志包都是免费的,使用非常方便,可以极大提高编程效率。并且,Apache为了让众多的日志工具有一个相同操作方式,还实现做了一个通用日志工具包commons-logging。
commons-logging是为那些需要建立在不同环境下使用不同日志架构的组件或库的开发者创建的,其中包括Apache Log4j以及Java log的日志架构。把日志信息commons-logging的Log接口,并由commons-logging在运行时决定使用哪种日志架构。
现在,以我见,Apache通用日志工具commons-logging和Log4j已经成为Java日志的标准工具。
下面我Log4j(对Java平台的)和通用日志工具包commons-logging的应用做一个总结。
一、&Log4j的架构
Log4j系统的三大板块:日志写入器、日志输出终端、日志布局模式。
650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' alt="" src="/attachment/293444.png" border="0" />&
Logger类是日志包的核心,Logger的名称是大小写敏感的,并且名称之间有继承关系。子名由父名做前缀,用点号“.”分隔,如x.y是x.y.z的父亲Logger。
Logger系统中有个根logger,是所有logger的祖先,它总是存在的,并且不可以通过名字获取,可以通过Logger.getRootLogger()来获取。
获取Logger对象的方法很多,可以参考API文档:
static Logger getLogger(Class clazz)
&&&&&&&&& Shorthand for getLogger(clazz.getName()).
static Logger getLogger(String name)
&&&&&&&&& Retrieve a logger named according to the value of the name parameter.
static Logger getLogger(String name, LoggerFactory factory)
&&&&&&&&& Like getLogger(String) except that the type of logger instantiated depends on the type returned by the LoggerFactory.makeNewLoggerInstance(java.lang.String) method of the factory parameter.
static Logger getRootLogger()
&&&&&&&&& Return the root logger for the current logger repository.
在某对象中,用该对象所属的类作为参数,调用Logger.getLogger(Class clazz)以获取logger对象被认为是目前所知最理智的命名logger方法。
用同名参数调用Logger.getLogger(Class clazz)将返回同一个logger对象。Logger的创建可以按照任意顺序,log4j将自动维护logger的继承树。
二、&Log4j的日志级别(Level)
每个logger都有一个日志级别,用来控制日志的输出。未分配级别的logger将自动继承它最近的父logger的日志级别。Logger的由低到高级别如下:
ALL&DEBUG&INFO&WARN&ERROR&FATAL&OFF
Logger的级别越低,输出的日志越详细。
三、&Log4j的输出终端(Appender接口)
Log4j提供了以下几个实现:
&org.apache.log4j.ConsoleAppender(控制台)
&org.apache.log4j.FileAppender(文件)
&org.apache.log4j.DailyRollingFileAppender(每天都产生一个日志文件)
&org.apache.log4j.RollingFileAppender(文件大小达到指定尺寸时产生一个新的日志文件,文件名称上会自动添加数字序号。)
&org.apache.log4j.WriterAppender(将日志信息以流的格式发送到任意指定的地方)
默认情况下,子logger将继承父logger的所有appenders。
rootlogger拥有目标为system.out的consoleAppender,故默认情况下,所有的logger都将继承该appender。
四、&Log4j的输出布局模式(Layout接口)
Log4j提供Layout有以下几种:
&org.apache.log4j.HTMLLayout(以HTML表格形式布局)
&org.apache.log4j.PatternLayout(可以灵活地指定布局模式)
&org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)
&org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等信息)
Log4j采用类似C语言中的printf函数的打印格式格式化日志信息。打印参数如下:
%m:输出代码中指定的消息。
%p:输出优先级。
%r:输入自应用启动到输出该log信息耗费的毫秒数。
%c:输出所属的类目,通常就是所在类的全名。
%t:输出产生该日志线程的线程名。
%n:输出一个回车换行符。Windows平台为“\r\n”,UNIX为“\n”。
%d:输出日志时间点的日期或时间,默认格式为ISO8601,推荐使用“%d{ABSOLUTE}”,这个输出格式形如:“ 18:23:23,500”,符合中国人习惯。
%l:输出日志事件发生的位置,包括类名、线程名,以及所在代码的行数。
五、&Log4j的配置
在实际使用中,Log4j一般是通过配置文件配置使用的。配置文件有两种,Java properties和XML文件。一般都选用properties文件来配置,因为简洁易读。下面只介绍Java properties的配置方式。
对Log4j的配置就是对rootLogger和子Logger的配置。主要的配置项为:rootLogger、输出终端、输出布局模式。
所有的配置项都必须以log4j开头。
下面给出一个配置文件的示例,用以说明配置的方法。
log4j.properties
-------------------------------------------------------------------------------------------------
1 ### logger的配置 ###
&2 #配置根logger
&3 log4j.rootLogger=INFO,stdout
&4 #配置子logger:org.lavasoft(在org.lavasoft包中类的日志在没有指定子logger名的情况下使用这个logger)
&5 log4j.logger.org.lavasoft=ERROR,file
&6 #配置子logger:org.lavasoft.test(在org.lavasoft.test包中类的日志在没有指定子logger名的情况下使用这个logger)
&7 log4j.logger.org.lavasoft.test=ERROR,file1,stdout
&9 ### direct log messages to stdout ### (标准的终端输出)
10 #控制台输出
11 log4j.appender.stdout=org.apache.log4j.ConsoleAppender
12 #自定义输出布局
13 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
14 #输出的格式
15 log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
17 ### direct messages to file ttt.log ### (输入到文件ttt.log的配置)
18 #输出到滚动文件
19 log4j.appender.file=org.apache.log4j.RollingFileAppender
20 #输出文件最大为10M
21 log4j.appender.file.MaxFileSize=10MB
22 #输出文件最大序号为10
23 log4j.appender.file.MaxBackupIndex=10
24 #输出文件路径
25 log4j.appender.file.File=C:/ttt.log
26 #自定义输出布局
27 log4j.appender.file.layout=org.apache.log4j.PatternLayout
28 #输出格式
29 log4j.appender.file.layout.ConversionPattern=%d %-5p [%t] (%13F:%L) %3x - %m%n
31 ### direct messages to file ttt.log ### (输入到文件ttt1.log的配置)
32 #输出到滚动文件
33 log4j.appender.file1=org.apache.log4j.RollingFileAppender
34 #输出文件最大为10M
35 log4j.appender.file1.MaxFileSize=10MB
36 #输出文件最大序号为10
37 log4j.appender.file1.MaxBackupIndex=10
38 #输出文件路径
39 log4j.appender.file1.File=C:/ttt1.log
40 #自定义输出布局
41 log4j.appender.file1.layout=org.apache.log4j.PatternLayout
42 #输出格式
43 log4j.appender.file1.layout.ConversionPattern=%d %-5p [%t] (%13F:%L) %3x - %m%n
-------------------------------------------------------------------------------------------------
下面对以上的文件解说,并给出一个应用例子:
logger的配置语法为:级别,输入终端1,输出终端2,…
根logger的配置项为:log4j.rootLogger
子logger的配置项为:
log4j.logger.&子logger名&
在上面的配置项中,配置了一个根logger和两个子logger,名称为:org.lavasoft和org.lavasoft.test,通过该名称,利用Logger.getLogger(String name)可以获取这两个logger对象。
子logger的名字一般都以包名来配置,这样当在程序通过类名获取logger的对象就是与本类包名相同的子logger,这样可以方便控制某个包下面logger的输出。
但是一般不建议设置子logger,一个通用的根logger足够用了。由于继承关系,并且可以在任何地方通过子logger的名字获取logger对象,这样容易导致混乱,比如在org.lavasoft包下的类直接获取了名为org.lavasoft.test子logger的对象,这是不合理的(虽然日志可以打印出来),因为如果直接在类中用Logger.getLogger(Class clazz)方式来获取Logger对象,则获取到的应该是名为org.lavasoft的logger对象,而不会得到名为org.lavasoft.test的logger对象。
以上的配置文件纯粹是为了说明问题才那么写的。
六、&Log4j与通用日志包commons-logging的结合
其实commons-logging中默认都支持Log4j,因此只要同时加载commons-logging包和log4j包,可以不用配置即可用在应用中使用commons-logging的接口方法。
当然,标准的应用的是需要的配置,如果你log4j则这个配置是可选的。下面我说明如何通过配置文件来组合commons-logging和log4j。
配置文件内容很简单,就指定一个日志实现类即可,下面是个示例文件:
commons-logging.properties
--------------------------------------------------------------------------------
mons.logging.Log=mons.logging.impl.Log4JLogger
--------------------------------------------------------------------------------
在使用Log4j作为日志工具的时候,commons-logging.properties的配置可以不要,在下面例子中,你可以尝试删除此文件,而不影响日志输出。
log4j.properties
--------------------------------------------------------------------------------
### logger的配置 ###
#配置根logger
log4j.rootLogger=info,stdout
#配置子logger:org.lavasoft(在org.lavasoft包中类的日志在没有指定子logger名的情况下使用这个logger)
log4j.logger.org.lavasoft=ERROR,file
#配置子logger:org.lavasoft.test(在org.lavasoft.test包中类的日志在没有指定子logger名的情况下使用这个logger)
log4j.logger.org.lavasoft.test=ERROR,file1,stdout
### direct log messages to stdout ### (标准的终端输出)
#控制台输出
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
#自定义输出布局
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
#输出的格式
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
### direct messages to file ttt.log ### (输入到文件ttt.log的配置)
#输出到滚动文件
log4j.appender.file=org.apache.log4j.RollingFileAppender
#输出文件最大为10M
log4j.appender.file.MaxFileSize=10MB
#输出文件最大序号为10
log4j.appender.file.MaxBackupIndex=10
#输出文件路径
log4j.appender.file.File=C:/ttt.log
#自定义输出布局
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d %-5p [%t] (%13F:%L) %3x - %m%n
### direct messages to file ttt.log ### (输入到文件ttt1.log的配置)
#输出到滚动文件
log4j.appender.file1=org.apache.log4j.RollingFileAppender
#输出文件最大为10M
log4j.appender.file1.MaxFileSize=10MB
#输出文件最大序号为10
log4j.appender.file1.MaxBackupIndex=10
#输出文件路径
log4j.appender.file1.File=C:/ttt1.log
#自定义输出布局
log4j.appender.file1.layout=org.apache.log4j.PatternLayout
log4j.appender.file1.layout.ConversionPattern=%d %-5p [%t] (%13F:%L) %3x - %m%n
--------------------------------------------------------------------------------
下面是TestLog工程的一个类HelloWorld.java,通过运行该类,可以看到日志的输出情况。
org.lavasoft.test. HelloWorld.java
--------------------------------------------------------------------------------
package org.lavasoft.
import mons.logging.L
import mons.logging.LogF
&* File Name:&& HelloWorld.java
&* Created by:& IntelliJ IDEA.
&* Copyright:&& Copyright (c)
&* Company:&&&& LavaSoft( )
&* Author:&&&&& leizhimin
&* Modifier:&&& leizhimin
&* Date Time:&&
&* Readme:
public class HelloWorld {
&&& public static void main(String args[]) {
&&&&&&& Log log1=LogFactory.getLog(HelloWorld.class);
&&&&&&& ("通过class对象来获取logger对象.");
&&&&&&& log1.error(".....error");
&&&&&&& new HelloWorld().test();
&&& public void test(){
&&&&&&& //获取(配置文件中)名称为log4j.logger.org.lavasoft.test的logger对象
&&&&&&& Log log2=LogFactory.getLog("org.lavasoft.test");
&&&&&&& ("2222");
&&&&&&& log2.error("222222HelloWorld的Error!");
&&&&&&& //获取(配置文件中)名称为log4j.logger.org.lavasoft的logger对象
&&&&&&& Log log3=LogFactory.getLog("org.lavasoft");
&&&&&&& ("3333");
&&&&&&& log3.error("33333..........errrr");
&&&&&&& //获取当前类所在
&&&&&&& Log log4=LogFactory.getLog(this.getClass());
&&&&&&& ("");
&&&&&&& log4.error(" ....error");
--------------------------------------------------------------------------------
运行org.lavasoft.test. HelloWorld.java,结果如下:
22:45:27,953 ERROR HelloWorld:20 - .....error
22:45:27,953 ERROR HelloWorld:20 - .....error
22:45:27,968 ERROR test:29 - 222222HelloWorld的Error!
22:45:27,968 ERROR test:29 - 222222HelloWorld的Error!
22:45:27,968 ERROR lavasoft:34 - 33333..........errrr
22:45:27,968 ERROR HelloWorld:39 -
22:45:27,968 ERROR HelloWorld:39 -
打开C盘,下面有两个日志文件ttt.log、ttt1.log,内容如下:
--------------------------------------------------------------------------------
22:45:27,953 ERROR [main] (HelloWorld.java:20)&&&& - .....error
22:45:27,968 ERROR [main] (HelloWorld.java:29)&&&& - 222222HelloWorld的Error!
22:45:27,968 ERROR [main] (HelloWorld.java:34)&&&& - 33333..........errrr
22:45:27,968 ERROR [main] (HelloWorld.java:39)&&&& -
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
22:45:27,953 ERROR [main] (HelloWorld.java:20)&&&& - .....error
22:45:27,968 ERROR [main] (HelloWorld.java:29)&&&& - 222222HelloWorld的Error!
22:45:27,968 ERROR [main] (HelloWorld.java:39)&&&& -
--------------------------------------------------------------------------------
从两个日志文件输出信息(类、loging的行数)可以看到,通过名称org.lavasoft.test获取的logger打印的ERROR级别的日志记录在C:/ttt1.log里面,而通过名称org.lavasoft获取的logger打印的ERROR级别的日志记录在C:/ttt.log里面,通过LogFactory.getLog(this.getClass())和LogFactory.getLog(HelloWorld.class);记录的日志实质上根据该类所在的包名来获取logger,因此实质上获取的是离他最近的logger(离它最近的logger就是该包上定义的logger对象,名称为org.lavasoft.test)。
其实仔细研究一下输出的logger就很容易看出其中的所以然,上面这种定义子logger的方法不推荐在项目中使用,一般只定义一个rootlogger就行了。
为了交流研究方便,我把TestLog整个工程的源代码(用IntellJ IDEA 5.12做的)打包放在附件里,当然也可以很容易的将此源代码加入Eclipse或者NetBean工程。
&本文出自 “” 博客,转载请与作者联系!
了这篇文章
类别:┆阅读(0)┆评论(0)
21:50:41 08:58:15 11:13:41 18:02:46 16:01:48 11:45:59 18:16:48 18:20:04 18:21:28 16:14:59 17:00:56

我要回帖

更多关于 log4j 输出指定包 的文章

 

随机推荐