Log4j的介绍
在应用程序中添加日志记录总的来说基于三个目的:
- 监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析工作;
- 跟踪代码运行时轨迹,作为日后审计的依据;
- 担当集成开发环境中的调试器的作用,向文件或控制台打印代码的调试信息。
这样最普通的做法就是在代码中嵌入许多的打印语句,这些打印语句可以输出到控制台或文件中,比较好的做法就是构造一个日志操作类来封装此类操作,而不是让一系列的打印语句充斥了代码的主体(如sysout)。
在强调可重用组件开发的今天,除了自己从头到尾开发一个可重用的日志操作类外,Apache为我们提供了一个强有力的日志操作包Log4j。
官方站点:http://logging.apache.org/log4j/
Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
此外,通过Log4j其他语言接口,您可以在C、C+ +、.Net、PL/SQL程序中使用Log4j,其语法和用法与在Java程序中一样,使得多语言分布式系统得到一个统一一致的日志组件模块。而且,通过使用各种第三方扩展,
您可以很方便地将Log4j集成到J2EE、JINI甚至是SNMP应用中。
Log4j构成
通过配置文件可知,我们需要配置3个方面的内容:
- 根目录(级别和目的地);
- 目的地(控制台、文件等等);
- 输出样式。
Log4j的类图
Logger --------------------------------------------------- 日志写出器,供程序员输出日志信息
Appender ------------------------------------------------ 日志目的地,把格式化好的日志信息输出到指定的地方去
ConsoleAppender --------------------------------------- 目的地为控制台的Appender
FileAppender -------------------------------------------- 目的地为文件的Appender
RollingFileAppender -------------------------------------目的地为大小受限的文件的Appender
Layout --------------------------------------------------- 日志格式化器,用来把程序员的logging request格式化成字符串
PatternLayout ------------------------------------------ 用指定的pattern格式化logging request的Layout
Log4j使用方法
Log4j由三个重要的组件构成:日志信息的优先级,日志信息的输出目的地,日志信息的输出格式。
日志信息的优先级从高到低有ERROR、WARN、 INFO、DEBUG,分别用来指定这条日志信息的重要程度;
日志信息的输出目的地指定了日志将打印到控制台,文件中;
而输出格式则控制了日志信息的显示内容。
Log4j支持两种配置文件格式,一种是XML格式的文件,一种是properties(key=value)文件。
properties配置文件详解
资源文件头:log4j.rootLogger = level,appenderName1,appenderName2
level 是日志记录的优先级,分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定义的级别。Log4j建议只使用四个级别,优先级从高到低分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关。比如在这里定义了INFO级别,则应用程序中所有DEBUG级别的日志信息将不被打印出来。
appenderName就是指B日志信息输出到哪个地方。您可以同时指定多个输出目的地。是指输出地方的变量名字,比如:log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender,appenderName是指CONSOLE这个变量名字
优先级:ALL < DEBUG < INFO <WARN < ERROR < FATAL < OFF
配置日志信息输出目的地Appender,其语法为:
log4j.appender.appenderName = Log4j提供的appender类
log4j.appender.appenderName.属性名 = 属性值
...................................................
log4j.appender.appenderName.属性名 = 属性值
|
其中,Log4j提供的appender有以下几种类:
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(将日志信息以流格式发送到任意指定的地方)
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指将消息覆盖指定的文件内容。
DailyRollingFileAppender 选项
Threshold=WARN:指定日志消息的输出最低层次。
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
File=mylog.txt:指定消息输出到mylog.txt文件。
Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
DatePattern=''.''yyyy-ww:每周滚动一次文件,即每周产生一个新的文件。
当然也可以指定按月、周、天、时和分。即对应的格式如下:
- ''.''yyyy-MM: 每月
- ''.''yyyy-ww: 每周
- ''.''yyyy-MM-dd: 每天
- ''.''yyyy-MM-dd-a: 每天两次
- ''.''yyyy-MM-dd-HH: 每小时
- ''.''yyyy-MM-dd-HH-mm: 每分钟
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:指定可以产生的滚动文件的最大数。
配置日志信息的格式(布局),其语法为:
log4j.appender.appenderName.layout = Log4j提供的layout类 log4j.appender.appenderName.layout.属性 = 值 .............................. log4j.appender.appenderName.layout.属性 = 值
其中,Log4j提供的layout有以下几种类:
1 org.apache.log4j.HTMLLayout(以HTML表格形式布局) 2 org.apache.log4j.PatternLayout(可以灵活地指定布局模式) 3 org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串) 4 org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
HTMLLayout选项
LocationInfo=true:默认值是false,输出java文件名称和行号
Title=my app file: 默认值是 Log4J Log Messages.
PatternLayout选项
ConversionPattern=%m%n :指定怎样格式化指定的消息。
XMLLayout选项
LocationInfo=true:默认值是false,输出java文件和行号
PatternLayout可以灵活的定义其样式
1 log4j.appender.A1.layout.ConversionPattern=%-4r %-5p %d{yyyy-MM-dd HH:mm:ssS} %c %m%n
这里需要说明的就是日志信息格式中几个符号所代表的含义:
- -X: 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平台为"\r\n",Unix平台为"\n"输出日志信息换行
可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。如:
- %20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,默认的情况下右对齐。
- %-20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,"-"号指定左对齐。
- %.30c:指定输出category的名称,最大的宽度是30,如果category的名称大于30的话,就会将左边多出的字符截掉,但小于30的话也不会有空格。
- %20.30c:如果category的名称小于20就补空格,并且右对齐,如果其名称长于30字符,就从左边交远销出的字符截掉
基本适用于各个场景的配置信息,具体根据需求修改
![](https://i-blog.csdnimg.cn/blog_migrate/cdec0645add3fc3c328197dda5c76203.gif)
一个例子:
Java代码:
1 import org.apache.log4j.Logger; 2 3 4 public class testlog4j { 5 private static final Logger logger = Logger.getLogger(testlog4j.class); 6 public static void main(String[] args) { 7 // 记录debug级别的信息 8 logger.debug("debug---yujie"); 9 // 记录info级别的信息 10 logger.info("info---yujie"); 11 // 记录error级别的信息 12 logger.error("error---yujie"); 13 } 14 15 }
propertise代码:
log4j.rootLogger=debug,FILE,CONSOLE #debug表示优先级 #FILE,CONSOLE表示输出变量名 #additivity\u7684\u4F5C\u7528\u5728\u4E8E children-logger\u662F\u5426\u4F7F\u7528 rootLogger\u7684\u914D\u7F6E\uFF0C\u4F8B\u5982 \u8F93\u51FA\u7EC8\u7AEF\u3002 log4j.additivity.org.apache=true # \u5E94\u7528\u4E8E\u63A7\u5236\u53F0 log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender log4j.appender.CONSOLE.Threshold=debug log4j.appender.CONSOLE.Target=System.out log4j.appender.CONSOLE.Encoding=GBK log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout log4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n #\u5E94\u7528\u4E8E\u6587\u4EF6 log4j.appender.FILE=org.apache.log4j.FileAppender log4j.appender.FILE.File=logfile08.html log4j.appender.FILE.Append=false log4j.appender.FILE.Encoding=GBK log4j.appender.FILE.layout=org.apache.log4j.HTMLLayout #log4j.appender.FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n #html样式不需要自定义Pattern
控制台输出:
[framework]
2012
-
09
-
09
02
:
07
:
15
,
651
- testlog4j -
0
[main] DEBUG testlog4j - debug---yujie
[framework]
2012
-
09
-
09
02
:
07
:
15
,
654
- testlog4j -
3
[main] INFO testlog4j - info---yujie
[framework]
2012
-
09
-
09
02
:
07
:
15
,
654
- testlog4j -
3
[main] ERROR testlog4j - error---yujie
|
HTML页面输出:
1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 2 <html> 3 <head> 4 <title>Log4J Log Messages</title> 5 <style type="text/css"> 6 <!-- 7 body, table {font-family: arial,sans-serif; font-size: x-small;} 8 th {background: #336699; color: #FFFFFF; text-align: left;} 9 --> 10 </style> 11 </head> 12 <body bgcolor="#FFFFFF" topmargin="6" leftmargin="6"> 13 <hr size="1" noshade> 14 Log session start time Sun Sep 09 02:07:15 CST 2012<br> 15 <br> 16 <table cellspacing="0" cellpadding="4" border="1" bordercolor="#224466" width="100%"> 17 <tr> 18 <th>Time</th> 19 <th>Thread</th> 20 <th>Level</th> 21 <th>Category</th> 22 <th>Message</th> 23 </tr> 24 25 <tr> 26 <td>0</td> 27 <td title="main thread">main</td> 28 <td title="Level"><font color="#339933">DEBUG</font></td> 29 <td title="testlog4j category">testlog4j</<span style="" col3="" log4j.appender.a1.dnbsp;"="">td> 30 <td title="Message">debug---yujie</td> 31 </tr> 32 33 <tr> 34 <td>3</td> 35 <td title="main thread">main</td> 36 <td title="Level">INFO</td> 37 <td title="testlog4j category">testlog4j</td> 38 <td title="Message">info---yujie</td> 39 </tr> 40 41 <tr> 42 <td>3</td> 43 <td title="main thread">main</td> 44 <td title="Level"><font color="#993300"><strong>ERROR</strong></font></td> 45 <td title="testlog4j category">testlog4j</td> 46 <td title="Message">error---yujie</td> 47 </tr>
XML配置文件详解
xml格式的log4j配置文件需要使用org.apache.log4j.html.DOMConfigurator.configure()方法来读入。对xml文件的语法定义可以在log4j的发布包中找到:org/apache/log4j/xml/log4j.dtd。
log4j的xml配置文件的树状结构如下所示,注意下图只显示了常用的部分。
xml declaration and dtd
|
log4j:configuration
|
+-- appender (name, class)
| |
| +-- param (name, value)
| +-- layout (class)
| |
| +-- param (name, value)
+-- logger (name, additivity)
| |
| +-- level (class, value)
| | |
| | +-- param (name, value)
| +-- appender-ref (ref)
+-- root
|
+-- param (name, class)
+-- level
| |
| +-- param (name, value)
+-- appender-ref (ref)
xml配置文件的头部包括两个部分:xml声明和dtd声明,不多介绍。头部的格式如下:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
log4j配置文件下的4个节点:
log4j:configuration (root element)
xmlns:log4j [#FIXED attribute]
定义log4j的名字空间,取定值"http://jakarta.apache.org/log4j/
appender [* child] : 一个appender子元素定义一个日志输出目的地
logger [* child] : 一个logger子元素定义一个日志写出器
root [? child] : root子元素定义了root logger
appender元素定义一个日志输出目的地:
name [#REQUIRED attribute] : 定义appender的名字,以便被后文引
class [#REQUIRED attribute] : 定义appender对象所属的类的全名
param [* child] : 创建appender对象时传递给类构造方法的参数
layout [? child] : 该appender使用的layout对象
layout元素定义与某一个appender相联系的日志格式化器:
class [#REQUIRED attribute] : 定义layout对象所属的类的全名
param [* child] : 创建layout对象时传递给类构造方法的参数
logger元素定义一个日志输出器:
name [#REQUIRED attribute] : 定义logger的名字,以便被后文引用
additivity [#ENUM attribute] : 取值为"true"(默认)或者"false",是否继承父logger的属性
level [? child] : 定义该logger的日志级别
appender-ref [* child] : 定义该logger的输出目的地
root元素定义根日志输出器root logger:
param [* child] : 创建root logger对象时传递给类构造方法的参数
level [? child] : 定义root logger的日志级别
appender-ref [* child] : 定义root logger的输出目的地
level元素定义logger对象的日志级别:
class [#IMPLIED attribute] : 定义level对象所属的类,默认情况下是"org.apache.log4j.Level类
value [#REQUIRED attribute] : 为level对象赋值。可能的取值从小到大依次为"all"、"debug"、
"info"、"warn"、"error"、"fatal"和"off"。当值为"off"时表示没有任何日志信息被输出
param [* child] : 创建level对象时传递给类构造方法的参数
appender-ref元素引用一个appender元素的名字,为logger对象增加一个appender。
ref [#REQUIRED attribute] : 一个appender元素的名字的引用
appender-ref元素没有子元素
param元素在创建对象时为类的构造方法提供参数。
它可以成为appender、layout、filter、errorHandler、level、categoryFactory和root等元素的子元素。
name and value [#REQUIRED attributes] : 提供参数的一组名值对
param元素没有子元素
创建ConsoleAppender对象
ConsoleAppender的构造方法不接受其它的参数。
<appender name="console.log" class="org.apache.log4j.ConsoleAppender"> <layout ... > ... ... </layout> </appender>
创建FileAppender对象
可以为FileAppender类的构造方法传递两个参数:File表示日志文件名;Append表示如文件已存在,是否把日志追加到文件尾部,可能取值为"true"和"false"(默认)。
<appender name="file.log" class="org.apache.log4j.FileAppender"> <param name="File" value="/tmp/log.txt" /> <param name="Append" value="false" /> <layout ... > ... ... </layout> </appender>
创建RollingFileAppender对象
除了File和Append以外,还可以为RollingFileAppender类的构造方法传递两个参数:MaxBackupIndex
备份日志文件的个数(默认是1个);MaxFileSize表示日志文件允许的最大字节数(默认是10M)。
<appender ame="rollingFile.log" class="org.apache.log4j.RollingFileAppender"> <param name="File" value="/tmp/rollingLog.txt" /> <param name="Append" value="false" /> <param name="MaxBackupIndex" value="2" /> <param name="MaxFileSize" value="1024" /> <layout ... > ... ... </layout> </appender>
创建PatternLayout对象
可以为PatternLayout类的构造方法传递参数ConversionPattern。
<layout class="org.apache.log4j.PatternLayout> <param name="Conversion" value="%d [%t] %p - %m%n" /> </layout>
例子:
java代码:
import org.apache.log4j.Logger; public class testlog4j { private static final Logger logger = Logger.getLogger(testlog4j.class); public static void main(String[] args) { // 记录debug级别的信息 logger.debug("debug---yujie"); // 记录info级别的信息 logger.info("info---yujie"); // 记录error级别的信息 logger.error("error---yujie"); } }
XML代码:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> <appender name="appender1" class="org.apache.log4j.RollingFileAppender"> <param name="File" value="logfile08.html" /> <param name="MaxFileSize" value="1MB" /> <param name="MaxBackupIndex" value="5" /> <layout class="org.apache.log4j.HTMLLayout"> </layout> </appender> <root> <level value="debug" /> <appender-ref ref="appender1" /> </root> </log4j:configuration>
在代码中使用Log4j
1.得到记录器
使用Log4j,第一步就是获取日志记录器,这个记录器将负责控制日志信息。其语法为:
public static Logger getLogger( String name)
通过指定的名字获得记录器,如果必要的话,则为这个名字创建一个新的记录器。Name一般取本类的名字,
比如:
static Logger logger = Logger.getLogger ( ServerWithLog4j.class.getName () )
2.读取配置文件
当获得了日志记录器之后,第二步将配置Log4j环境,其语法为:
BasicConfigurator.configure (): 自动快速地使用缺省Log4j环境。 PropertyConfigurator.configure ( String configFilename) :读取使用Java的特性文件编写的配置文件。 DOMConfigurator.configure ( String filename ) :读取XML形式的配置文件。
3.插入记录信息(格式化日志信息)
当上两个必要步骤执行完毕,您就可以轻松地使用不同优先级别的日志记录语句插入到您想记录日志的任何地方,其语法如下:
Logger.debug ( Object message ) ;
Logger.info ( Object message ) ;
Logger.warn ( Object message ) ;
Logger.error ( Object message ) ;
PDF下载连接:http://files.cnblogs.com/ChrisRIM/log4j从入门到详解.pdf
转自:http://www.cnblogs.com/ChrisRIM/archive/2012/09/09/2677195.html