??xml version="1.0" encoding="utf-8" standalone="yes"?>
Loggerslg在此pȝ中被分ؓ五个U别QDEBUG、INFO、WARN、ERROR和FATAL。这五个U别是有序的,DEBUG < INFO < WARN < ERROR < FATALQ明白这一点很重要Q这里Log4j有一个规则:假设LoggersU别为PQ如果在Loggers中发生了一个别Q比P高,则可以启动,否则屏蔽掉?/p>
JavaE序举例来说Q?/strong>
//建立Logger的一个实例,命名?#8220;com.foo”
Logger logger = Logger.getLogger("com.foo");
//讄logger的别。通常不在E序中设|logger的别。一般在配置文g中设|?/p>
logger.setLevel(Level.INFO);
Logger barlogger = Logger.getLogger("com.foo.Bar");
//下面q个h可用Q因为WARN >= INFO
logger.warn("Low fuel level.");
//下面q个h不可用,因ؓDEBUG < INFO
logger.debug("Starting search for nearest gas station.");
//命名?#8220;com.foo.bar”的实例barlogger会承实?#8220;com.foo”的别。因此,下面q个h可用Q因为INFO >= INFO
barlogger.info("Located nearest gas station.");
//下面q个h不可用,因ؓDEBUG < INFO
barlogger.debug("Exiting gas station search");
q里“是否可用”的意思是能否输出Logger信息?/strong>
在对Logger实例q行命名Ӟ没有限制Q可以取L自己感兴的名字。一般情况下以类的所在位|来命名Logger实例Q这是目前来讲比较有效的Logger命名方式。这样可以得每个类建立自己的日志信息,便于理。比如:
static Logger logger = Logger.getLogger(ClientWithLog4j.class.getName());
2?Appenders
用与用日志请求只是Log4j其中的一个小的地方QLog4j日志pȝ允许把日志输出到不同的地方,如控制台QConsoleQ、文ӞFilesQ、根据天数或者文件大生新的文件、以的形式发送到其它地方{等?/p>
其语法表CZؓQ?/p>
org.apache.log4j.ConsoleAppenderQ控制台Q,
org.apache.log4j.FileAppenderQ文ӞQ?br /> org.apache.log4j.DailyRollingFileAppenderQ每天生一个日志文ӞQorg.apache.log4j.RollingFileAppenderQ文件大到达指定尺寸的时候生一个新的文ӞQ?br /> org.apache.log4j.WriterAppenderQ将日志信息以流格式发送到L指定的地方)配置时用方式ؓQ?/p>
log4j.appender.appenderName = fully.qualified.name.of.appender.class
log4j.appender.appenderName.option1 = value1
…
log4j.appender.appenderName.option = valueN
q样׃ؓ日志的输出提供了相当大的便利?/p>
3?Layouts
有时用户希望Ҏ自己的喜好格式化自己的日志输出。Log4j可以在Appenders的后面附加Layouts来完成这个功能。Layouts提供了四U日志输出样式,如根据HTML样式、自由指定样式、包含日志别与信息的样式和包含日志旉、线E、类别等信息的样式等{?/p>
其语法表CZؓQ?/p>
org.apache.log4j.HTMLLayoutQ以HTML表格形式布局Q,
org.apache.log4j.PatternLayoutQ可以灵zd指定布局模式Q,
org.apache.log4j.SimpleLayoutQ包含日志信息的U别和信息字W串Q,
org.apache.log4j.TTCCLayoutQ包含日志生的旉、线E、类别等{信息)配置时用方式ؓQ?/p>
log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
log4j.appender.appenderName.layout.option1 = value1
…
log4j.appender.appenderName.layout.option = valueN
以上是从原理斚w说明Log4j的用方法,在具?span style="background-color: yellow">Java~程使用Log4j可以参照以下CZQ?br />
1?建立Logger实例Q?br />
语法表示Qpublic static Logger getLogger( String name)
实际使用Qstatic Logger logger = Logger.getLogger (ServerWithLog4j.class.getName ()) ;
2?d配置文gQ?/strong>
获得了Logger的实例之后,接下来将配置Log4j使用环境Q?br />
语法表示Q?br />
BasicConfigurator.configure()Q自动快速地使用~省Log4j环境?br />
PropertyConfigurator.configure(String configFilename)Q读取用Java的特性文件编写的配置文g?/span>
DOMConfigurator.configure(String filename)Q读取XML形式的配|文件?br />
实际使用QPropertyConfigurator.configure("ServerWithLog4j.properties");
3?插入日志信息
完成了以上连个步骤以后,下面可以按日志的不同别插入到你要记录日志的Q何地方了?br />
语法表示Q?br />
Logger.debug(Object message);
Logger.info(Object message);
Logger.warn(Object message);
Logger.error(Object message);
实际使用Qlogger.info("ServerSocket before accept: " + server);
在实际编E时Q要使Log4j真正在系l中q行事先q要寚w|文件进行定义。定义步骤就是对Logger、Appender及Layout的分别用,具体如下Q?/span>
1?配置根LoggerQ其语法为:
log4j.rootLogger = [ level ] , appenderName, appenderName, …
q里level指Logger的优先QappenderName是日志信息的输出圎ͼ可以同时指定多个输出地。如Qlog4j.rootLogger= INFO,A1,A2
2?配置日志信息输出目的?/strong>Q其语法为:
log4j.appender.appenderName = fully.qualified.name.of.appender.class
可以指定上面所qC个目的地中的一个?br />
3?配置日志信息的格?/strong>Q其语法为:
log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
q里上面三个步骤是对前面Log4jlg说明的一个简化;下面l出一个具体配|例子,在程序中可以参照执行Q?br />
log4j.rootLogger=INFO,A1
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=
%-4r %-5p %d{yyyy-MM-dd HH:mm:ssS} %c %m%n
q里需要说明的是日志信息格式中几个符h代表的含义:
QX? X信息输出时左寚wQ?br />
%p: 日志信息U别
%d{}: 日志信息产生旉
%c: 日志信息所在地Q类名)
%m: 产生的日志具体信?br />
%n: 输出日志信息换行
Ҏ上面的日志格式,某一个程序的输出l果如下Q?/strong>
0 INFO 2003-06-13 13:23:46968 ClientWithLog4j Client socket: Socket[addr=localhost/127.0.0.1,port=8002,localport=2014]
16 DEBUG 2003-06-13 13:23:46984 ClientWithLog4j Server says: 'Java server with log4j, Fri Jun 13 13:23:46 CST 2003'
16 DEBUG 2003-06-13 13:23:46984 ClientWithLog4j GOOD
16 DEBUG 2003-06-13 13:23:46984 ClientWithLog4j Server responds: 'Command 'HELLO' not understood.'
16 DEBUG 2003-06-13 13:23:46984 ClientWithLog4j HELP
16 DEBUG 2003-06-13 13:23:46984 ClientWithLog4j Server responds: 'Vocabulary: HELP QUIT'
16 DEBUG 2003-06-13 13:23:46984 ClientWithLog4j QUIT
1996q初Q欧z安全电子市?EU SEMPER)目l决定编写自q日志记录APIQ后来这个API演变成了Log4j。Log4j是一个开放源码项目,一个非常流行的Java日志记录包。它允许开发者向代码中插入日志记录语句,q允许在不修改应用程序源码的情况下修Ҏ志记录的行ؓ?/p>
几乎每一个项目都会用日志记录,但是׃日志记录不是目的核心,因此受重视的E度一般不是很高。我们认Z用日志记录是一仉怸肃的事情Q而且做好使用日志记录的规划比单纯记录日志本n更加重要?/p>
本文比较全面的阐述Log4j的设计原理和使用Ҏ?/p>
日志记录记录的是应用E序q行的轨qV我们可以通过查看q些轨迹来调试应用程序,q可能也是日志记录最为流行的用法了。但是我们必L识到规划良好的日志记录中q含有丰富的信息Q通过手工的方式或借助一些工?大多数时候需要自己来书写q些工具)来分析挖掘这些信息?/p>
例如Q如果我们在规划中指出必记录用L每一ơ操作,记录的样式ؓ [日志信息]-[操作开始的旉]-[日志U别]-[日志cd]-[用户名]-[操作名]-[消息]Q这只是我们假设的一U样式,实际的日志中一般会含有比这更加丰富的信息。ؓ了更好的理解Q我们根据该样式构造了一些日志记?其中日志cdorg.solol.Main、org.solol.Parser和org.solol.UserOperator使用了不同的样式)Q?/p>
[日志信息]-[2006-07-30 08:54:20]-[INFO]-[org.solol.Main]-[具体的消息] [日志信息]-[2006-07-30 08:55:20]-[INFO]-[org.solol.UserOperator]-[User1]-[查询报表1]-[具体的消息] [日志信息]-[2006-07-30 08:55:30]-[INFO]-[org.solol.UserOperator]-[User1]-[查询报表2]-[具体的消息] [日志信息]-[2006-07-30 08:56:01]-[INFO]-[org.solol.Parser]-[具体的消息] [日志信息]-[2006-07-30 08:57:26]-[INFO]-[org.solol.UserOperator]-[User2]-[d用户User3]-[具体的消息] [日志信息]-[2006-07-30 08:58:20]-[INFO]-[org.solol.UserOperator]-[User1]-[查询报表3]-[具体的消息] [日志信息]-[2006-07-30 08:59:38]-[INFO]-[org.solol.UserOperator]-[User3]-[查询报表1]-[具体的消息] [日志信息]-[2006-07-30 08:59:39]-[INFO]-[org.solol.UserOperator]-[User2]-[退出系l]-[具体的消息]
从上面的日志记录中我们很Ҏ抽取出某一用户的操作列表,如对于用户User1我们的结果ؓQ?/p>
[日志信息]-[2006-07-30 08:55:20]-[INFO]-[org.solol.UserOperator]-[User1]-[查询报表1]-[具体的消息] [日志信息]-[2006-07-30 08:55:30]-[INFO]-[org.solol.UserOperator]-[User1]-[查询报表2]-[具体的消息] [日志信息]-[2006-07-30 08:58:20]-[INFO]-[org.solol.UserOperator]-[User1]-[查询报表3]-[具体的消息]
q样我们得C某一旉D中User1的操作列表,可以利用q一列表来进行安全分析?/p>
我们q可以从另外的角度来分析上面的日志记录,如我们很Ҏl计出操?日志cd为org.solol.UserOperator)发生的L?6?Q其中操作[查询报表1]?ơ,[查询报表2]?ơ,[查询报表3]?ơ,[d用户User3]?ơ,[退出系l]?ơ。这h们就可以得出pȝ中的那些操作用户使用的比较频J?/p>
以上我们从两个角度对日记记录中的信息q行了简单的挖掘Q实际中待挖掘的斚w要丰富的多,q取决于您的意图和您的想象力?/p>
q里我们q要特别一下:所有这一切都需要有使用日志记录的良好规?/strong>。如果规划不?x志记录没有规律?Q那么我们挖掘时的Q务就会非常繁重或者挖掘成ؓ一个不可能的Q务?
文章Cq里我们要来描述日志记录的最为流行的用法了,卌试应用程序。我们在调试应用E序时一般会使用两种ҎQ除了日志记录之外,q有debugger调试器?/p>
我们不想把他们放Ch描述Q因是两个完全不同的问题Q虽然他们都用来调试应用E序。用debugger调试器我们可以清楚的知道引发错误的上下文及其相关信息Q也可以使用单步执行、设|断炏V检查变量以及暂挂和恢复U程{等比较高的能力,但是管q样它也不能替代日志记录Q同h志记录也不能替代debugger调试器。我们要l合使用q两U方法,不同的场景用不同的Ҏ会有更好的效果?/p>
我们认ؓ使用日志记录来调试应用程也应该充分考虑软g的开发周期。这里我们只考虑软g开发周期中的与日志记录有关的两个阶D:
阅读到这里我们就应该着手实现我们的日志记录了。比较幸q的是我们有好多日志记录软g包可选,q就使我们不必关心日志记录的l节Q只要把主要的精力放到日志记录的规划上就好了。我们选择的是Log4jQ文章的余下部分主要介l这个Java日志记录软g包?/p>
log4j的特性列表:
Log4j有三个主要的lgQLogger、Appender和Layout。这三个lg怺配合使得我们可以获得非常强大的日志记录的能力?/p>
Logger的名U是区分大小写的Q依据名U可以确定其层次l构(即父子关p?Q规则如下:
在Logger的层ơ结构的最层是root loggerQ它会永q存在,而且不能通过名字取到?/p>
上面文字的描q可能不好的理解Qؓ此我们给Z一张图QLogger的层ơ结构图Q从中可以非常直观的看出三种主要lg的关pd各自所L作用?/p>
Loger x.y是Logger x.y.z的祖先,因ؓx.y.是x.y.z的前~Q这W合规则的前一条。另外在Logger x.y和Logger x.y.z之间QLogger x.y.z没有其它的祖先,因此Logger x.y是Logger x.y.z的父Ԍq符合规则的后一条。这h们依据上面的规则可以构造出如图1所C的Logger的层ơ结构?/p>
从图1中我们还可以看到每一个Logger都有一个LevelQ根据该Level的值Logger军_是否处理对应的日志请求。如果Level没有被设|,p?中的Logger x.y一P又该怎么办呢Q答案是可以从祖先那里ѝ?/p>
如果Logger C没有被设|LevelQ那么它沿着它的层次l构向上查找,如果扑ֈq承ƈl束Q否则会一直查扑ֈroot loggerl束。因为log4j在设计时保证root logger会被讄一个默认的Level,所以Q何logger都可以承到Level?/p>
?中的Logger x.y没有被设|LevelQ但是根据上面的l承规则QLogger x.yl承了root logger的Level?/p>
我们在来看看Logger选择日志记录h(log request)的规则:
假设Logger MhqU的LevelQ这个Level可能是设|的也可能是l承到的?/p>
如果向Logger M发出一个Level为p的日志记录请求,那么只有满p>=q时这个日志记录请求才会被处理?/p>
org.apache.log4j.Logger中的不同Ҏ发出不同Level的日志记录请求,如下Q?/p>
其中的静态常量DEBUG、INFO、WARN、ERROR、FATAL是在org.apache.log4j.Level中定义的Q除了用这些预定义的Level之外QLog4jq支持自定义Level?/p>
注:org.apache.log4j.Level中还预定义了一些其它的Level?/p>
在Log4j中,Appender指的是日志记录输出的目的地。当前支持的Appender(目的?有文?file)、控制台(console)、java.io.OutputStream、java.io.Writer、远E服务器、远EUnix Syslog守护者、远EJMS监听者、NT EventLog或者发送e-mail。如果您在上面没有找到适合的AppenderQ那需要考虑实现自己的自定义Appender了?
每个Logger可以有多个AppenderQ但是相同的Appender只会被添加一ơ?/p>
Appender的附加性意味着Logger C会将日志记录发给它的和它先的所有Appender。在?中Logger a会将日志记录发给它自qJDBCAppender和它的祖先root logger的ConsoleAppender和FileAppender。Logger x.y.z自己没有AppenderQ它把日志记录发给它的先root logger的ConsoleAppender和FileAppenderQ如果Logger x.y也含有AppenderQ那么它们也会包括在内?
Appender的附加性是可以被中断的。假设Logger C的一个祖先ؓLogger PQ如果Logger P的附加性标?additivity flag)讄为假Q那么Logger C会将日志记录只发l它的和在它和Logger P之间的祖?包括Logger P)的AppenderQ而不会发lLogger P的祖先的Appender。Logger的附加性标?additivity flag)默认gؓture?
在图1中如果没有设|Logger a的附加性标?additivity flag)Q而是使用默认值trueQ那么Logger a会将日志记录发给它自qJDBCAppender和它先root logger的ConsoleAppender和FileAppenderQ这和上面的描述相同。如果设|Logger a的附加性标?additivity flag)的值falseQ那么Logger a会将日志记录发给它自qJDBCAppender而不会在发给它祖先root logger的ConsoleAppender和FileAppender了?
Appender定制了输出目的地Q通常我们q需要定制日志记录的输出格式,在Log4j中是通过Layout和Appender兌Ch实现的。Layout依据用户的要求来格式化日志记录。PatternLayout(标准Log4jlg)让用户依据类gC语言printf函数的{换模式来指定输出格式?
例如Q{换模?conversion pattern)?%r [%t] %-5p %c - %m%n"的PatternLayout生成类g以下内容的输出:
176 [main] INFO org.foo.Bar - Located nearest gas station.
在上面的输出中:
Log4j中还提到了一些其它的LayoutQ包括HTMLLayout、SimpleLayout、XMLLayout、TTCCLayout和DateLayout。如果这些不能满x的要求,q可以自定义自己的Layout?/p>
依据既有的经验显C用于日志记录的代码大约是全部代码量?%。如果应用程序具有一定的规模Q日志记录语句的数量q是比较巨大的,因此必须有效的管理这些语句?/p>
在Log4j中我们可以通过配置Log4j环境来有效的理日志记录。配|的方式有三U:
通过E序配置Log4j环境实际上就是在应用E序的代码中改变Logger的Level或增加减Appender{等?/p>
Log4j提供了BasicConfiguratorQ它只是为root loggerdAppender。其中,
我们可以把BasicConfigurator看成是一个简单的使用E序配置Log4j环境的示例。例如,要给root loggerd两个Appender(A和B)Q下面的代码分别完成了这个要求?/p>
不用BasicConfiguratorQ?/p>
//CZ代码Q不能直接? Logger root = Logger.getRootLogger(); root.addAppender(A); root.addAppender(B);
使用BasicConfiguratorQ?/p>
//CZ代码Q不能直接? BasicConfigurator.configure(A); BasicConfigurator.configure(B);
q里要用PropertyConfigurator来分析配|文件ƈ讄日志记录Q但是要注意日志记录先前的配|不会被清除和重设?
Property文g是由key=valueq样的键值对所l成的,可以使用#?作ؓ注释行的开始。下面给Z两个单的CZQ?/p>
非常单的CZ1Q?/p>
log4j.rootLogger=DEBUG, A1 log4j.appender.A1=org.apache.log4j.ConsoleAppender log4j.appender.A1.layout=org.apache.log4j.PatternLayout log4j.appender.A1.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n
E显复杂的示?Q?/p>
log4j.rootLogger=, A1, A2 log4j.appender.A1=org.apache.log4j.ConsoleAppender log4j.appender.A1.layout=org.apache.log4j.PatternLayout log4j.appender.A1.layout.ConversionPattern=%d %-5p [%t] %-17c{2} (%13F:%L) %3x - %m%n log4j.appender.A2=org.apache.log4j.FileAppender log4j.appender.A2.File=filename.log log4j.appender.A2.Append=false log4j.appender.A2.layout=org.apache.log4j.PatternLayout log4j.appender.A2.layout.ConversionPattern=%-5r %-5p [%t] %c{2} - %m%n
上面的两个示例只是让您对配置文g的格式有一个大体的认识Q我们将在后面详l的描述各个配置元素的语法?/p>
Repository-wide thresholdQ?/p>
Repository-wide threshold指定的Level的优先高于Logger本n的Level。语法ؓlog4j.threshold=[level]Qlevel可以为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL。也可以使用自定义LevelQ这时的语法为log4j.threshold=[level#classname]。默认ؓALL?/p>
依据上面的规则,我们有这Ll论Q如果log4j.threshold=ERRORQLogger C的Level=DEBUGQ这时只有高于等于ERROR的日志记录请求会被Logger C处理?/p>
Appender的配|:
Appender的配|语法ؓ
# For appender named appenderName, set its class. # Note: The appender name can contain dots. log4j.appender.appenderName=fully.qualified.name.of.appender.class # Set appender specific options. log4j.appender.appenderName.option1=value1 ... log4j.appender.appenderName.optionN=valueN #For each named appender you can configure its Layout. #The syntax for configuring an appender's layout is: log4j.appender.appenderName.layout=fully.qualified.name.of.layout.class log4j.appender.appenderName.layout.option1=value1 .... log4j.appender.appenderName.layout.optionN=valueN
Logger的配|:
root logger的配|语法:
log4j.rootLogger=[level], appenderName, appenderName, ...Q其中level可以为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL。也可以使用自定义LevelQ这时的语法为[level#classname]?/p>
如果Level被指定那么root logger的Level被配置为指定倹{如果Level没有被指定那么root logger的Level不会被修攏V从上面的语法中我们可以看出通过?分隔的列表可以ؓroot logger指定多个Appender?/p>
对于root logger之外的logger语法是相似的Qؓlog4j.logger.logger_name=[level|INHERITED|NULL], appenderName, appenderName, ...
上面只有INHERITED和NULL需要说明一下,其它部分和root logger相同。INHERITED和NULL的意义是相同的。如果我们用了它们Q意味着q个logger不在用自qLevel而是从它的祖先那里ѝ?/p>
Logger的附加性标?additivity flag)可以使用log4j.additivity.logger_name=[false|true]来配|?/p>
ObjectRenderer配置Q?/p>
我们可以通过ObjectRenderer来定义将消息对象转换成字W串的方式。语法ؓlog4j.renderer.fully.qualified.name.of.rendered.class=fully.qualified.name.of.rendering.class。如Q?/p>
//my.Fruitcd的消息对象将由my.FruitRenderer转换成字W串 log4j.renderer.my.Fruit=my.FruitRenderer
对上面的各个配置元素的语法理解之后,在来看示??很Ҏ了?/p>
PropertyConfigurator不支持Filter的配|。如果要支持Filter您可以用DOMConfiguratorQ即使用XML文g的方式配|?/p>
要用DOMConfigurator.configure()来读取XML格式的配|文件。XML文g格式的定义是通过org/apache/log4j/xml/log4j.dtd来完成的Q各个配|元素的嵌套关系如下Q?/p>
<!ELEMENT log4j:configuration (renderer*, appender*,(category|logger)*,root?,categoryFactory?)>
q里没有l出更ؓ详细的内容,要了解详l的内容需要查阅log4j.dtd?/p>
下面q个单的CZ可以使您对XML配置文g的格式有一个基本的认识Q?/p>
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE log4j SYSTEM "log4j.dtd"> <log4j> <appender name="A1" class="org.apache.log4j.FileAppender"> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%-5p %c{2} - %m\n"/> </layout> </appender> <appender name="A2" class="org.apache.log4j.FileAppender"> <layout class="org.apache.log4j.TTCCLayout"> <param name="DateFormat" value="ISO8601" /> </layout> <param name="File" value="warning.log" /> <param name="Append" value="false" /> </appender> <category name="org.apache.log4j.xml" priority="debug"> <appender-ref ref="A1" /> </category> <root priority="debug"> <appender-ref ref="A1" /> <appender-ref ref="A2" /> </root> </log4j>
public static void main(StringQ] args) {//自己替换Q]
System.setProperty("org.apache.commons.logging.Log",
"org.apache.commons.logging.impl.Jdk14Logger");
Log log = LogFactory.getLog("com.discursive.jccook.SomeApp");
if (log.isTraceEnabled()) {
log.trace("This is a trace message");
}
if (log.isDebugEnabled()) {
log.debug("This is a debug message");
}
log.info("This is an informational message");
log.warn("This is a warning");
log.error("This is an error");
log.fatal("This is fatal");
}
其实您也可以完全不用配|文Ӟ而是在代码中配置Log4j环境。但是,使用配置文g您的应用E序更加灉|。Log4j支持两种配置文g格式Q一U是XML格式的文Ӟ一U是JavaҎ文Ӟ?|。下面我们介l用JavaҎ文件做为配|文件的ҎQ?/p>
1.配置根LoggerQ其语法为:
log4j.rootLogger = [ level ] , appenderName, appenderName, ?
其中Qlevel 是日志记录的优先U,分ؓOFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定义的别。Log4j只用四个别,优先U从高到低分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的U别Q您可以控制到应用程序中相应U别的日志信息的开兟뀂比如在q里定义了INFOU别Q则应用E序中所有DEBUGU别的日志信息将不被打印出来?appenderName是指定日志信息输出到哪个地斏V您可以同时指定多个输出目的地?
2.配置日志信息输出目的地AppenderQ其语法为:
log4j.appender.appenderName = fully.qualified.name.of.appender.class
log4j.appender.appenderName.option1 = value1
?
log4j.appender.appenderName.option = valueN
其中QLog4j提供的appender有以下几U:
org.apache.log4j.ConsoleAppenderQ控制台Q,
org.apache.log4j.FileAppenderQ文ӞQ?
org.apache.log4j.DailyRollingFileAppenderQ每天生一个日志文ӞQ?br /> org.apache.log4j.RollingFileAppenderQ文件大到达指定尺寸的时候生一个新的文ӞQ?
org.apache.log4j.WriterAppenderQ将日志信息以流格式发送到L指定的地方)
3.配置日志信息的格式(布局Q,其语法ؓQ?/p>
log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
log4j.appender.appenderName.layout.option1 = value1
?
log4j.appender.appenderName.layout.option = valueN
其中QLog4j提供的layout有以下几U:
org.apache.log4j.HTMLLayoutQ以HTML表格形式布局Q,
org.apache.log4j.PatternLayoutQ可以灵zd指定布局模式Q,
org.apache.log4j.SimpleLayoutQ包含日志信息的U别和信息字W串Q,
org.apache.log4j.TTCCLayoutQ包含日志生的旉、线E、类别等{信息)
Log4J采用cMC语言中的printf函数的打印格式格式化日志信息Q打印参数如下:
%m 输出代码中指定的消息
%n 输出一个回车换行符QWindowsq_为“\r\n”,Unixq_为“\n”?br />%p 输出优先U,即DEBUGQINFOQWARNQERRORQFATAL
%r 输出自应用启动到输出该log信息耗费的毫U数
%c 输出所属的cȝQ通常是所在类的全?
%t 输出产生该日志事件的U程?br />%d 输出日志旉点的日期或时_默认格式为ISO8601Q也可以在其后指定格式,
比如Q?d{yyy MMM dd HH:mm:ss,SSS}Q输出类|2002q?0?8?22Q?0Q?8Q?21
%l 输出日志事g的发生位|,包括cȝ名、发生的U程Q以及在代码中的行数?br /> 举例QTestlog4.main(TestLog4.java:10)
%F cȝ?br />%L 代码中的行数
二、在代码中用Log4j
1.得到记录?/p>
使用Log4jQ第一步就是获取日志记录器Q这个记录器负责控制日志信息。其语法为:
public static Logger getLogger( String name)
通过指定的名字获得记录器Q如果必要的话,则ؓq个名字创徏一个新的记录器。Name一般取本类的名字,比如Q?
static Logger logger = Logger.getLogger ( ServerWithLog4j.class.getName () )
2.d配置文g
当获得了日志记录器之后,W二步将配置Log4j环境Q其语法为:
BasicConfigurator.configure ()Q?自动快速地使用~省Log4j环境?br /> PropertyConfigurator.configure ( String configFilename) Q读取用Java的特性文件编写的配置文g?br /> DOMConfigurator.configure ( String filename ) Q读取XML形式的配|文件?/p>
3.插入记录信息Q格式化日志信息Q?/p>
当上两个必要步骤执行完毕Q您可以轻村֜使用不同优先U别的日志记录语句插入到您想记录日志的Q何地方,其语法如下:
Logger.debug ( Object message ) ;
Logger.info ( Object message ) ;
Logger.warn ( Object message ) ;
Logger.error ( Object message ) ;
介绍
命o行参数解析、应用程序配|和日志记录Q作Z个应用程序的骨架Q随处可见。因此,Apache软gl织开发出了一套通用的类库,用来帮助软g开发h员完成这些“骨架”的建立。其中:
•Commons CLI用于命o行解?br />•Commons Configuration用于dproperties格式或者XML格式的配|信?br />•Commons Logging和Log4J用来提供日志支持?br />q些通用的类库都在http://jakarta.apache.org/commons/index.html|址上提供下?br />
Log4J是一个高度可配置的Logging框架Q提供了l构化,多种目标和格式支持?br />
•配置Log4J
问题Q?br />Log4J支持Properties和XML两种格式的配|文件?br />解决ҎQ?br />定义log4j.properties配置文g
# 所有Log信息输出到标准输?System.out)和在下面指定的一个文?br /># WARN是默认的loggingU别
log4j.rootCategory = WARN, STDOUT, FILE
# 应用E序的loggingU别是DEBUG
log4j.logger.com.discursive = DEBUG
# 配置标准输出Appender
log4j.appender.STDOUT = org.apache.log4j.ConsoleAppender
log4j.appender.STDOUT.layout = org.apache.log4j.PatternLayout
log4j.appender.STDOUT.layout.ConversionPattern = %5p (%F:%L) %m%n
# 配置输出文gAppender
log4j.appender.FILE = org.apache.log4j.RollingFileAppender
log4j.appender.FILE.File = output.log
log4j.appender.FILE.MaxFileSize = 2000KB
log4j.appender.FILE.MaxBackupIndex = 5
log4j.appender.FILE.layout = org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern = %d %-5p %c - %m%n
PropertyConfigurator.configure(getClass()
.getResource("/resources/log4j.properties"));
Logger logger = Logger.getLogger("com.discursive.SomeApp");
logger.info("This is a info message");
logger.error("This is a error message");
使用BasicConfiguratorcL加蝲log4j.properties配置。用Logger.getLogger获得一个logger实例?br />配置文g中的rootCategory指定log输出到控制台和output.log文g。文件Appender使用了RollingFileAppenderQ当文g大小辑ֈ最大文件大?MaxFileSize)2000KBӞRollingFileAppender会备份原log文gQƈ再创Z个新的log文g?br />配置文g指定默认的loggingU别是DEBUG(log4j.logger.com.discursive = DEBUG)。所以,所有别低于DEBUG的log信息都不会被输出。Log4J按重要度定义了五个logU别Q分别是QDEBUG, INFO, WARN, ERROR, 和FATAL?br />其他Q?br />Log4Jq可以用XML格式的配|文Ӟ使用DOMConfiguratord?br />Log4J使用Appender和Layout来定制log输出。Appender指定输出C处,Layout指定如何输出(输出的格??br />Log4J内置的Appender有:
•SMTPAppender
•RollingFileAppender
•SocketAppender
•SyslogAppender
•NTEventLogAppender
Log4J支持的Layout?br />•XMLLayout
•PatternLayout
•HTMLLayout
•DateLayout.
?
# 所有Log信息输出到标准输?System.out)和在下面指定的一个文?br /># WARN是默认的loggingU别
log4j.rootCategory = INFO, STDOUT
#log4j.rootCategory = INFO, STDOUT, FILE
# 配置标准输出Appender
log4j.appender.STDOUT = org.apache.log4j.ConsoleAppender
log4j.appender.STDOUT.layout = org.apache.log4j.PatternLayout
log4j.appender.STDOUT.layout.ConversionPattern = %d{ABSOLUTE} %-5p [%c:%L] %m%n
# 配置输出文gAppender
log4j.appender.FILE = org.apache.log4j.RollingFileAppender
log4j.appender.FILE.File = output.log
log4j.appender.FILE.MaxFileSize = 2000KB
log4j.appender.FILE.MaxBackupIndex = 5
log4j.appender.FILE.layout = org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern = %d %-5p [%c:%L] %m%n
# 应用E序的loggingU别是DEBUG
log4j.logger.com.xzc = DEBUG
?
### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
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 hibernate.log ###
#log4j.appender.file=org.apache.log4j.FileAppender
#log4j.appender.file.File=hibernate.log
#log4j.appender.file.layout=org.apache.log4j.PatternLayout
#log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
### set log levels - for more verbose logging change 'info' to 'debug' ###
log4j.rootLogger=warn, stdout
log4j.logger.net.sf.hibernate=warn
### log just the SQL
#log4j.logger.net.sf.hibernate.SQL=debug
### log JDBC bind parameters ###
log4j.logger.net.sf.hibernate.type=info
### log schema export/update ###
log4j.logger.net.sf.hibernate.tool.hbm2ddl=debug
### log cache activity ###
#log4j.logger.net.sf.hibernate.cache=debug
### enable the following line if you want to track down connection ###
### leakages when using DriverManagerConnectionProvider ###
#log4j.logger.net.sf.hibernate.connection.DriverManagerConnectionProvider=trace
?
log4j.rootLogger=debug, stdout, R 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 log4j.appender.R=org.apache.log4j.RollingFileAppender log4j.appender.R.File=example.log log4j.appender.R.MaxFileSize=100KB # Keep one backup file log4j.appender.R.MaxBackupIndex=1 log4j.appender.R.layout=org.apache.log4j.PatternLayout log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n
?
# Log4j׃个重要的lg构成Q日志信息的优先U,日志信息的输出目的地Q日志信息的输出格式
# 1.配置根LoggerQ其语法为:
# log4j.rootLogger = [ level ] , appenderName, appenderName, ?
# 2.配置日志信息输出目的地AppenderQ其语法为:
# log4j.appender.appenderName = fully.qualified.name.of.appender.class
# log4j.appender.appenderName.option1 = value1
# ?
# log4j.appender.appenderName.option = valueN
# Log4j提供的appender有以下几U:
# org.apache.log4j.ConsoleAppenderQ控制台Q,
# org.apache.log4j.FileAppenderQ文ӞQ?
# org.apache.log4j.DailyRollingFileAppenderQ每天生一个日志文ӞQ?br /># org.apache.log4j.RollingFileAppenderQ文件大到达指定尺寸的时候生一个新的文ӞQ?
# org.apache.log4j.WriterAppenderQ将日志信息以流格式发送到L指定的地方)
# 3.配置日志信息的格式(布局Q,其语法ؓQ?br /># log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
# log4j.appender.appenderName.layout.option1 = value1
# ?
# log4j.appender.appenderName.layout.option = valueN
# Log4j提供的layout有以下几U:
# org.apache.log4j.HTMLLayoutQ以HTML表格形式布局Q,
# org.apache.log4j.PatternLayoutQ可以灵zd指定布局模式Q,
# org.apache.log4j.SimpleLayoutQ包含日志信息的U别和信息字W串Q,
# org.apache.log4j.TTCCLayoutQ包含日志生的旉、线E、类别等{信息)
# Log4J采用cMC语言中的printf函数的打印格式格式化日志信息Q打印参数如下:
# %m 输出代码中指定的消息
# %n 输出一个回车换行符QWindowsq_为“\r\n”,Unixq_为“\n?
# %p 输出优先U,即DEBUGQINFOQWARNQERRORQFATAL
# %r 输出自应用启动到输出该log信息耗费的毫U数
# %c 输出所属的cȝQ通常是所在类的全?
# %t 输出产生该日志事件的U程?br /># %d 输出日志旉点的日期或时_默认格式为ISO8601Q也可以在其后指定格式,
# 比如Q?d{yyy MMM dd HH:mm:ss,SSS}Q输出类|2002q?0?8?22Q?0Q?8Q?21
# %l 输出日志事g的发生位|,包括cȝ名、发生的U程Q以及在代码中的行数?br /># 举例QTestlog4.main(TestLog4.java:10)
# %F cȝ?br /># %L 代码中的行数
# 所有Log信息输出到标准输?System.out)和在下面指定的一个文?
# 日志信息的优先从从高到低有ERROR、WARN、INFO、DEBUG
# WARN是默认的loggingU别
log4j.rootCategory = INFO, STDOUT
#log4j.rootCategory = INFO, STDOUT, FILE
#log4j.rootCategory = INFO, STD
# 配置标准输出Appender
log4j.appender.STDOUT = org.apache.log4j.ConsoleAppender
log4j.appender.STDOUT.layout = org.apache.log4j.PatternLayout
#log4j.appender.STDOUT.layout.ConversionPattern = %d{ABSOLUTE} %-5p [%c:%t:%L] %m%n
log4j.appender.STDOUT.layout.ConversionPattern = %d{ABSOLUTE} %-5p [ %l ] %m%n
# 配置输出文gAppender
log4j.appender.FILE = org.apache.log4j.RollingFileAppender
log4j.appender.FILE.File = output.log
log4j.appender.FILE.MaxFileSize = 2000KB
log4j.appender.FILE.MaxBackupIndex = 5
log4j.appender.FILE.layout = org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern = %d %-5p [%c:%L] %m%n
# 配置默认输出layout
log4j.appender.STD = org.apache.log4j.ConsoleAppender
log4j.appender.STD.layout = org.apache.log4j.TTCCLayout
# 应用E序的loggingU别是DEBUG
log4j.logger.com.xzc = DEBUG