Apache Log4j配置说明
本文详细介绍Log4j的所有配置属性。
author: ZJ 07-3-17
1.Log4j简介
Log4j是Apache的一个开源项目,它允许开发者以任意间隔输出日志信息。Log4j主要由三大类组件构成:
1)Logger-负责输出日志信息,并能够对日志信息进行分类筛选,即决定哪些日志信息应该被输出,哪些该被忽略。Loggers组件输出日志信息时分为5个级别:DEBUG、INFO、WARN、ERROR、FATAL。这五个级别的顺序是:DEBUG<INFO<WARN<ERROR<FATAL。如果设置某个Logger组件的级别是P,则只有级别比P高的日志信息才能输出。Logger是有继承关系的,最上层是rootLogger,定义的其他Logger都会继承rootLogger。
如:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" ><!-- debug="false" -->
<appender name="appAppender" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="xcom_app.log" />
<param name="Threshold" value="debug" />
<param name="MaxFileSize" value="2MB" />
<param name="Append" value="true" />
<param name="MaxBackupIndex" value="10" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d [%c{1}] %-5p %m%n" />
</layout>
</appender>
<appender name="accessMonAppender" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="xcom_mon.log" />
<param name="Threshold" value="debug" />
<param name="MaxFileSize" value="2MB" />
<param name="Append" value="true" />
<param name="MaxBackupIndex" value="10" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %m%n" />
</layout>
</appender>
<appender name="rpcAccessAppender" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="xcom_jsonrpc.log" />
<param name="Threshold" value="debug" />
<param name="MaxFileSize" value="2MB" />
<param name="Append" value="true" />
<param name="MaxBackupIndex" value="10" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %m%n" />
</layout>
</appender>
<appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
<param name="Target" value="System.out" />
<param name="Threshold" value="debug" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{ABSOLUTE} [%c{1}] %-5p %m%n" />
</layout>
</appender>
<appender name="myFile" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="c:\\TIMSLOG\\output.log" /><!-- 设置日志输出文件名 -->
<!-- 设置是否在重新启动服务时,在原有日志的基础添加新日志 -->
<param name="Append" value="true" />
<param name="MaxBackupIndex" value="10" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%p (%c:%L)- %m%n" />
</layout>
</appender>
<appender name="logAppender" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="c:\\TIMSLOG\\sdhs-log.log" />
<param name="DatePattern" value="'.'yyyy-MM-dd'.log'" />
<param name="encoding" value="gbk" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="[%d{MMdd HH:mm:ss SSS\} %-5p] [%t] %c{3\} - %m%n" />
</layout>
</appender>
<!-- 指定logger的设置,additivity指示是否遵循缺省的继承机制//com.waycool.hsdb-->
<logger name="com.waycool.controller" additivity="false">
<!-- <level value ="debug"/> --> Logger组件的级别
<level value ="info"/> Logger组件的级别
<appender-ref ref="logAppender" />
<appender-ref ref="CONSOLE" />
</logger>
<!-- 根logger的设置-->
<root>
<priority value ="info" />
<appender-ref ref="CONSOLE" />
<appender-ref ref="myFile" />
</root>
</log4j:configuration>
如:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" ><!-- debug="false" -->
<appender name="appAppender" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="xcom_app.log" />
<param name="Threshold" value="debug" />
<param name="MaxFileSize" value="2MB" />
<param name="Append" value="true" />
<param name="MaxBackupIndex" value="10" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d [%c{1}] %-5p %m%n" />
</layout>
</appender>
<appender name="accessMonAppender" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="xcom_mon.log" />
<param name="Threshold" value="debug" />
<param name="MaxFileSize" value="2MB" />
<param name="Append" value="true" />
<param name="MaxBackupIndex" value="10" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %m%n" />
</layout>
</appender>
<appender name="rpcAccessAppender" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="xcom_jsonrpc.log" />
<param name="Threshold" value="debug" />
<param name="MaxFileSize" value="2MB" />
<param name="Append" value="true" />
<param name="MaxBackupIndex" value="10" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %m%n" />
</layout>
</appender>
<appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
<param name="Target" value="System.out" />
<param name="Threshold" value="debug" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{ABSOLUTE} [%c{1}] %-5p %m%n" />
</layout>
</appender>
<appender name="myFile" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="c:\\TIMSLOG\\output.log" /><!-- 设置日志输出文件名 -->
<!-- 设置是否在重新启动服务时,在原有日志的基础添加新日志 -->
<param name="Append" value="true" />
<param name="MaxBackupIndex" value="10" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%p (%c:%L)- %m%n" />
</layout>
</appender>
<appender name="logAppender" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="c:\\TIMSLOG\\sdhs-log.log" />
<param name="DatePattern" value="'.'yyyy-MM-dd'.log'" />
<param name="encoding" value="gbk" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="[%d{MMdd HH:mm:ss SSS\} %-5p] [%t] %c{3\} - %m%n" />
</layout>
</appender>
<!-- 指定logger的设置,additivity指示是否遵循缺省的继承机制//com.waycool.hsdb-->
<logger name="com.waycool.controller" additivity="false">
<!-- <level value ="debug"/> --> Logger组件的级别
<level value ="info"/> Logger组件的级别
<appender-ref ref="logAppender" />
<appender-ref ref="CONSOLE" />
</logger>
<!-- 根logger的设置-->
<root>
<priority value ="info" />
<appender-ref ref="CONSOLE" />
<appender-ref ref="myFile" />
</root>
</log4j:configuration>
2)Appender-定义了日志输出目的地,指定日志信息应该被输出到什么地方。输出的目的地可以是控制台、文件或网络设备。
3)Layout-通过在Appender的后面附加Layout来实现格式化输出。
一个Logger可以有多个Appender,每个Appender对应一个Layout。
2.Loggers
Logger的定义格式:log4j.[loggername]=[level],appenderName,appenderName,…
这里level是指Logger的优先级,appenderName是日志信息的输出地,可以同时定义多个输出地。
3.Appenders
Appender的定义格式:
log4j.appender.appenderName = fully.qualified.name.of.appender.class
// "fully.qualified.name.of.appender.class" 可以指定下面五个目的地中的一个:
Appender类及其作用列表
Appender类名
|
作 用
|
org.apache.log4j.ConsoleAppender
|
将日志输出到控制台
|
org.apache.log4j.FileAppender
|
将日志输出到文件
|
org.apache.log4j.DailyRollingFileAppender
|
每天产生一个日志文件
|
org.apache.log4j.RollingFileAppender
|
文件大小到达指定尺寸时产生一个新的文件
|
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:每周滚动一次文件,即每周产生一个新的文件。当然也可以指定按月、周、天、时和分。即对应的格式如下:
'.'yyyy-MM: 每月
'.'yyyy-ww: 每周
'.'yyyy-MM-dd: 每天
'.'yyyy-MM-dd-a: 每天两次
'.'yyyy-MM-dd-HH: 每小时
'.'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:指定可以产生的滚动文件的最大数。
4.Layouts
Layout的定义格式:
部分一log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
//"fully.qualified.name.of.layout.class" 可以指定下面4个格式中的一个:
Layout类及其作用列表
Layout类名
|
作 用
|
org.apache.log4j.HTMLLayout
|
以HTML表格形式布局
|
org.apache.log4j.PatternLayout
|
可以灵活地指定布局模式
|
org.apache.log4j.SimpleLayout
|
包含日志信息的级别和信息字符串
|
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文件和行号。
部分二 log4j.appender.A1.layout.ConversionPattern=
%-4r %-5p %d{yyyy-MM-dd HH:mm:ssS} %c %m%n
这里需要说明的就是日志信息格式中几个符号所代表的含义:
1)-X号: X信息输出时左对齐。
2)%p: 输出日志信息优先级,即DEBUG,INFO,WARN,ERROR,FATAL。
3)%d: 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921。
4)%r: 输出自应用启动到输出该log信息耗费的毫秒数。
5)%c: 输出日志信息所属的类目,通常就是所在类的全名。
6)%t: 输出产生该日志事件的线程名。
7)%l: 输出日志事件的发生位置,相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)。
8)%x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。
9)%%: 输出一个"%"字符。
10)%F: 输出日志消息产生时所在的文件名称。
11) %L: 输出代码中的行号。
12)%m: 输出代码中指定的消息,产生的日志具体信息。
13)%n: 输出一个回车换行符,Windows平台为"\r\n",Unix平台为"\n"输出日志信息换行。
可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。如:
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字符,就从左边交远销出的字符截掉。
5.Apache Log介绍集
[1] Apache Log4j配置说明
[2] Apache Log4j使用实例
6.参考资料
[1] 赵强,精通JSP编程,电子工业出版社
[2] Log4j配置过程
[url]http://hi.baidu.com/hunqiu/blog/item/7386ad6e[/url]59c5a4da81cb4a31.html
本文出自 “i张俊” 博客,请务必保留此出处http://zhangjunhd.blog.51cto.com/113473/21014
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
log4j的分层打印
在开发的过程中,我们总会想看到更多的错误,这时候log4j便产生了作用,但是有时候我们总会把日志给打印在一个文件中,那我们如何对各个不同的模块的日志进行分不同的日志文件存放呢,比如dao、service、controller、error、jsp等不同层次的日志。
1、log4j的配置
- <?xml version="1.0" encoding="UTF-8" ?>
- <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
- <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
- <appender name="ConsoleAppender" class="org.apache.log4j.ConsoleAppender">
- <layout class="org.apache.log4j.SimpleLayout" />
- </appender>
- <!-- 根,会把所有涉及到的log都打印出来
- 根logger没有默认的appender
- 根logger默认被分配了Level.DEBUG的级别
- -->
- <root>
- <level value="INFO" />
- <appender-ref ref="ConsoleAppender" />
- </root>
- <!--
- A、
- (1)、如果类别的名称(后面加一个点)是其子类别名称的前缀,则它就是另一个类别的祖类
- (2)、如果一个类别和它的子类别之间没有其他的继承关系,我们就称之为parent与child的关系
- 例如:类别com.foo是类别com.foo.Bar的parent。
- B、
- 根(root) 类别位于logger继承结构的最上层。它有两种例外:
- (1) 它一直存在
- (2) 它不能根据名称而获得。
- 调用类的静态方法Logger.getRootLogger可以得到它
- C、
- 如果一个Logger没有被分配一个级别,那么它将从一个被分配了级别的最接近它的ancestor哪里继承。
- 正规的说:级别的继承:对于一个给定的Logger C,它的继承的级别等于从C开始上溯到的第一个拥有非空级别的Logger的级别。
- D、
- 对于一个给定的logger,它每个生效的日志请求都被转发到logger所有的appender上和该logger的父辈logger的appender上。
- 换句话说,appende自动从它的父辈获得继承。举例来说,如果一个根logger拥有一个console appender,
- 那么所有生效的日志请求至少会被输出到console上。
- 如果一个名为C的logger有一个file类型的appender,那么它就会对它自己以及所有它的子logger生效。
- E、
- 我们也可以通过设置appender的additivity flag为false,来重载appender的默认行为,以便继承的属性不在生效。
- F、
- Log4j的子logger只连接到已经存在的它们的父代。特别的是,名为com.foo.bar的logger是直接连接到根logger,
- 而不是围绕着没用的com或com.foo logger。这显著的提高了程序性能并且减少的内存占用。
- G、
- 避免参数构建的花费应如下,
- if(logger.isDebugEnabled() {
- logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));
- }
- 如果logger的debug被关闭这将不会招致参数构建的花费。另一方面,如果logger是debug的话,它将产生两次判断 logger是否能用的花费。
- 一次是在debugenabled,一次是debug。这是无关紧要的,因为判断日志是否可用只占日志实际花费时间的约1%。
- H、 如果是DailyRollingFileAppender的话,不会立刻生成error.log.2014.02.23.log,而是先生成error.log,然后等到这天的
- 23:59分,把当天的日志写到error.log.2014.02.23.log的文件中去
- 如果DailyRollingFileAppender的append=true的话,即使当天没有日志,也会生成error.log.2014.02.23.log文件,否则不会生成
- -->
- <!-- dao层的日志 -->
- <appender name="dao" class="org.apache.log4j.FileAppender">
- <param name="File" value="${webapp.root}/logs/dao.log" />
- <param name="Append" value="true" />
- <!--
- Log4j提供的layout有以下几种:
- org.apache.log4j.HTMLLayout(以HTML表格形式布局),
- org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
- org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
- org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
- %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
- %r 输出自应用启动到输出该log信息耗费的毫秒数
- %c 输出所属的类目,通常就是所在类的全名
- %t 输出产生该日志事件的线程名
- %n 输出一个回车换行符,Windows平台为"\r\n",Unix平台为"\n"
- %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921
- %l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)
- -->
- <layout class="org.apache.log4j.PatternLayout">
- <param name="ConversionPattern" value="%d [%t] %p - %m%n" />
- </layout>
- </appender>
- <!-- 以com.hj.dao包开头的所涉及到的类进行log -->
- <logger name="com.hj.dao" additivity="true">
- <level value="INFO" />
- <appender-ref ref="dao" />
- </logger>
- <!-- service层的日志 -->
- <appender name="service" class="org.apache.log4j.FileAppender">
- <param name="File" value="${webapp.root}/logs/service.log" />
- <param name="MaxFileSize" value="5MB" />
- <param name="MaxBackupIndex" value="20" />
- <param name="Encoding" value="utf-8"/>
- <layout class="org.apache.log4j.PatternLayout">
- <param name="ConversionPattern" value="%d [%-5p][%t] %c{1} %m %n" />
- </layout>
- </appender>
- <!-- 以com.hj.service包开头的所涉及到的类进行log -->
- <logger name="com.hj.service" additivity="true">
- <level value="INFO" />
- <appender-ref ref="service" />
- </logger>
- <!-- controller层的日志 -->
- <appender name="controller" class="org.apache.log4j.RollingFileAppender">
- <param name="File" value="${webapp.root}/logs/controller.log" />
- <param name="MaxFileSize" value="5MB" />
- <param name="MaxBackupIndex" value="20" />
- <param name="Encoding" value="utf-8"/>
- <layout class="org.apache.log4j.PatternLayout">
- <param name="ConversionPattern" value="%d [%-5p][%t] %c{1} %m %n" />
- </layout>
- </appender>
- <!-- 以com.hj.controller包开头的所涉及到的类进行log -->
- <!-- 输出源的可添加性(Appender Additivity):一个名为C的logger的日志定义的输出将延续到它自身以及它的ancestor logger的appenders
- Loggers的附加标记(additivity flag)默认为true。 -->
- <logger name="com.hj.controller" additivity="true">
- <level value="INFO" />
- <appender-ref ref="controller" />
- </logger>
- <!-- 异常捕获的日志 -->
- <appender name="error" class="org.apache.log4j.RollingFileAppender">
- <param name="File" value="${webapp.root}/logs/error.log" />
- <param name="MaxFileSize" value="5MB" />
- <param name="MaxBackupIndex" value="20" />
- <param name="Encoding" value="utf-8"/>
- <layout class="org.apache.log4j.PatternLayout">
- <param name="ConversionPattern" value="%d [%-5p][%t] %c{1} %m %n" />
- </layout>
- </appender>
- <!-- 对com.hj.exception.ErrorHandler类进行log -->
- <logger name="com.hj.exception.ErrorHandler" additivity="true">
- <level value="ERROR" />
- <appender-ref ref="error" />
- </logger>
- </log4j:configuration>
2、dao层
- @Repository
- public class UserDao {
- private Logger logger = Logger.getLogger(this.getClass());
- public void show(){
- logger.info("this is DAO add");
- }
- public void exception(){
- String str = null;
- try{
- str.charAt(2);
- }catch(Exception e){
- logger.error("DAO空指针异常", e);
- }
- }
- public void throwsExcep() throws Exception{
- String str = null;
- logger.info("dao测试异常");
- str.charAt(2);
- }
- }
3、service层
- @Service
- public class UserService {
- private Logger logger = Logger.getLogger(this.getClass());
- @Resource
- private UserDao userDao;
- public void show(){
- logger.info("ths is Service add");
- userDao.show();
- }
- public void exception(){
- String str = null;
- try{
- str.charAt(2);
- }catch(Exception e){
- logger.error("Service空指针异常", e);
- }
- userDao.exception();
- }
- public void throwsExcep() throws Exception{
- logger.info("service测试异常");
- userDao.throwsExcep();
- }
- }
4、controller层
- @Controller
- public class UserController {
- private Logger logger = Logger.getLogger(this.getClass());
- @Resource
- private UserService userService;
- @RequestMapping(value = "/show")
- public String show(){
- logger.info("this is Controller add");
- userService.show();
- return "index";
- }
- @RequestMapping(value = "/exception")
- public String exception(){
- String str = null;
- try{
- str.charAt(2);
- }catch(Exception e){
- logger.error("Controller空指针异常", e);
- }
- userService.exception();
- return "index";
- }
- @RequestMapping(value = "/throwsExcep")
- public String throwsExcep() throws Exception{
- logger.info("controller测试异常");
- userService.throwsExcep();
- return "index";
- }
- }
5、异常处理中心,捕获所有controller的所有异常
- @ControllerAdvice
- public class ErrorHandler {
- private Logger logger = Logger.getLogger(this.getClass());
- @ExceptionHandler(value = Exception.class)
- public @ResponseBody Object errorResponse(Exception e) {
- logger.error("异常处理中心", e);
- return e;
- }
- }
6、生成的日志文件
工程下载地址:http://download.csdn.net/detail/wxwzy738/7409341