Apache Log4j配置说明/log4j的分层打印

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>


 
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介绍集
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的配置

  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">  
  3. <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">  
  4.   
  5.   
  6.     <appender name="ConsoleAppender" class="org.apache.log4j.ConsoleAppender">  
  7.         <layout class="org.apache.log4j.SimpleLayout" />  
  8.     </appender>  
  9.     <!-- 根,会把所有涉及到的log都打印出来  
  10.            根logger没有默认的appender   
  11.            根logger默认被分配了Level.DEBUG的级别  
  12.     -->  
  13.     <root>  
  14.         <level value="INFO" />  
  15.         <appender-ref ref="ConsoleAppender" />  
  16.     </root>  
  17.       
  18.     <!--   
  19.     A、  
  20.         (1)、如果类别的名称(后面加一个点)是其子类别名称的前缀,则它就是另一个类别的祖类  
  21.         (2)、如果一个类别和它的子类别之间没有其他的继承关系,我们就称之为parent与child的关系  
  22.          例如:类别com.foo是类别com.foo.Bar的parent。  
  23.     B、  
  24.          根(root) 类别位于logger继承结构的最上层。它有两种例外:  
  25.         (1) 它一直存在  
  26.         (2) 它不能根据名称而获得。  
  27.         调用类的静态方法Logger.getRootLogger可以得到它  
  28.     C、  
  29.         如果一个Logger没有被分配一个级别,那么它将从一个被分配了级别的最接近它的ancestor哪里继承。  
  30.         正规的说:级别的继承:对于一个给定的Logger C,它的继承的级别等于从C开始上溯到的第一个拥有非空级别的Logger的级别。  
  31.     D、  
  32.         对于一个给定的logger,它每个生效的日志请求都被转发到logger所有的appender上和该logger的父辈logger的appender上。  
  33.         换句话说,appende自动从它的父辈获得继承。举例来说,如果一个根logger拥有一个console appender,  
  34.         那么所有生效的日志请求至少会被输出到console上。  
  35.         如果一个名为C的logger有一个file类型的appender,那么它就会对它自己以及所有它的子logger生效。  
  36.     E、  
  37.         我们也可以通过设置appender的additivity flag为false,来重载appender的默认行为,以便继承的属性不在生效。  
  38.     F、  
  39.         Log4j的子logger只连接到已经存在的它们的父代。特别的是,名为com.foo.bar的logger是直接连接到根logger,  
  40.         而不是围绕着没用的com或com.foo logger。这显著的提高了程序性能并且减少的内存占用。  
  41.     G、  
  42.         避免参数构建的花费应如下,  
  43.         if(logger.isDebugEnabled() {  
  44.             logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));  
  45.         }  
  46.         如果logger的debug被关闭这将不会招致参数构建的花费。另一方面,如果logger是debug的话,它将产生两次判断 logger是否能用的花费。  
  47.         一次是在debugenabled,一次是debug。这是无关紧要的,因为判断日志是否可用只占日志实际花费时间的约1%。  
  48.     H、  如果是DailyRollingFileAppender的话,不会立刻生成error.log.2014.02.23.log,而是先生成error.log,然后等到这天的  
  49.        23:59分,把当天的日志写到error.log.2014.02.23.log的文件中去  
  50.              如果DailyRollingFileAppender的append=true的话,即使当天没有日志,也会生成error.log.2014.02.23.log文件,否则不会生成  
  51.      -->  
  52.     <!-- dao层的日志 -->  
  53.     <appender name="dao" class="org.apache.log4j.FileAppender">  
  54.         <param name="File" value="${webapp.root}/logs/dao.log" />  
  55.         <param name="Append" value="true" />  
  56.         <!--   
  57.         Log4j提供的layout有以下几种:  
  58.         org.apache.log4j.HTMLLayout(以HTML表格形式布局),  
  59.         org.apache.log4j.PatternLayout(可以灵活地指定布局模式),  
  60.         org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),  
  61.         org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)  
  62.           
  63.         %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL  
  64.         %r 输出自应用启动到输出该log信息耗费的毫秒数  
  65.         %c 输出所属的类目,通常就是所在类的全名  
  66.         %t 输出产生该日志事件的线程名  
  67.         %n 输出一个回车换行符,Windows平台为"\r\n",Unix平台为"\n"  
  68.         %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921  
  69.         %l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)  
  70.          -->  
  71.         <layout class="org.apache.log4j.PatternLayout">  
  72.             <param name="ConversionPattern" value="%d [%t] %p - %m%n" />  
  73.         </layout>  
  74.     </appender>  
  75.     <!-- 以com.hj.dao包开头的所涉及到的类进行log -->  
  76.     <logger name="com.hj.dao" additivity="true">  
  77.         <level value="INFO" />  
  78.         <appender-ref ref="dao" />  
  79.     </logger>  
  80.       
  81.     <!-- service层的日志 -->  
  82.     <appender name="service" class="org.apache.log4j.FileAppender">  
  83.         <param name="File" value="${webapp.root}/logs/service.log" />  
  84.         <param name="MaxFileSize" value="5MB" />  
  85.         <param name="MaxBackupIndex" value="20" />  
  86.         <param name="Encoding" value="utf-8"/>  
  87.         <layout class="org.apache.log4j.PatternLayout">  
  88.             <param name="ConversionPattern" value="%d [%-5p][%t] %c{1} %m %n" />  
  89.         </layout>  
  90.     </appender>  
  91.     <!-- 以com.hj.service包开头的所涉及到的类进行log -->  
  92.     <logger name="com.hj.service" additivity="true">  
  93.         <level value="INFO" />  
  94.         <appender-ref ref="service" />  
  95.     </logger>  
  96.       
  97.     <!-- controller层的日志 -->  
  98.     <appender name="controller" class="org.apache.log4j.RollingFileAppender">  
  99.         <param name="File" value="${webapp.root}/logs/controller.log" />  
  100.         <param name="MaxFileSize" value="5MB" />  
  101.         <param name="MaxBackupIndex" value="20" />  
  102.         <param name="Encoding" value="utf-8"/>  
  103.         <layout class="org.apache.log4j.PatternLayout">  
  104.             <param name="ConversionPattern" value="%d [%-5p][%t] %c{1} %m %n" />  
  105.         </layout>  
  106.     </appender>  
  107.     <!-- 以com.hj.controller包开头的所涉及到的类进行log -->  
  108.     <!-- 输出源的可添加性(Appender Additivity):一个名为C的logger的日志定义的输出将延续到它自身以及它的ancestor logger的appenders  
  109.          Loggers的附加标记(additivity flag)默认为true。 -->  
  110.     <logger name="com.hj.controller" additivity="true">  
  111.         <level value="INFO" />  
  112.         <appender-ref ref="controller" />  
  113.     </logger>  
  114.       
  115.     <!-- 异常捕获的日志 -->  
  116.     <appender name="error" class="org.apache.log4j.RollingFileAppender">  
  117.         <param name="File" value="${webapp.root}/logs/error.log" />  
  118.         <param name="MaxFileSize" value="5MB" />  
  119.         <param name="MaxBackupIndex" value="20" />  
  120.         <param name="Encoding" value="utf-8"/>  
  121.         <layout class="org.apache.log4j.PatternLayout">  
  122.             <param name="ConversionPattern" value="%d [%-5p][%t] %c{1} %m %n" />  
  123.         </layout>  
  124.     </appender>  
  125.     <!-- 对com.hj.exception.ErrorHandler类进行log -->  
  126.     <logger name="com.hj.exception.ErrorHandler" additivity="true">  
  127.         <level value="ERROR" />  
  128.         <appender-ref ref="error" />  
  129.     </logger>  
  130. </log4j:configuration>  

2、dao层
  1. @Repository  
  2. public class UserDao {  
  3.       
  4.     private Logger logger = Logger.getLogger(this.getClass());  
  5.       
  6.     public void show(){  
  7.         logger.info("this is DAO add");  
  8.     }  
  9.       
  10.     public void exception(){  
  11.         String str = null;  
  12.         try{  
  13.             str.charAt(2);  
  14.         }catch(Exception e){  
  15.             logger.error("DAO空指针异常", e);  
  16.         }  
  17.     }  
  18.   
  19.     public void throwsExcep() throws Exception{  
  20.         String str = null;  
  21.         logger.info("dao测试异常");  
  22.         str.charAt(2);  
  23.     }  
  24. }  

3、service层
  1. @Service  
  2. public class UserService {  
  3.       
  4.     private Logger logger = Logger.getLogger(this.getClass());  
  5.       
  6.     @Resource  
  7.     private UserDao userDao;  
  8.       
  9.     public void show(){  
  10.         logger.info("ths is Service add");  
  11.         userDao.show();  
  12.     }  
  13.       
  14.     public void exception(){  
  15.         String str = null;  
  16.         try{  
  17.             str.charAt(2);  
  18.         }catch(Exception e){  
  19.             logger.error("Service空指针异常", e);  
  20.         }  
  21.         userDao.exception();  
  22.     }  
  23.       
  24.     public void throwsExcep() throws Exception{  
  25.         logger.info("service测试异常");  
  26.         userDao.throwsExcep();  
  27.     }  
  28. }  

4、controller层
  1. @Controller  
  2. public class UserController {  
  3.       
  4.     private Logger logger = Logger.getLogger(this.getClass());  
  5.       
  6.     @Resource  
  7.     private UserService userService;  
  8.       
  9.     @RequestMapping(value = "/show")  
  10.     public String show(){  
  11.         logger.info("this is Controller add");  
  12.         userService.show();  
  13.         return "index";  
  14.     }  
  15.       
  16.     @RequestMapping(value = "/exception")  
  17.     public String exception(){  
  18.         String str = null;  
  19.         try{  
  20.             str.charAt(2);  
  21.         }catch(Exception e){  
  22.             logger.error("Controller空指针异常", e);  
  23.         }  
  24.         userService.exception();  
  25.         return "index";  
  26.     }  
  27.   
  28.     @RequestMapping(value = "/throwsExcep")  
  29.     public String throwsExcep() throws Exception{  
  30.         logger.info("controller测试异常");  
  31.         userService.throwsExcep();  
  32.         return "index";  
  33.     }  
  34. }  

5、异常处理中心,捕获所有controller的所有异常
  1. @ControllerAdvice   
  2. public class ErrorHandler {  
  3.       
  4.     private Logger logger = Logger.getLogger(this.getClass());  
  5.       
  6.     @ExceptionHandler(value = Exception.class)  
  7.     public @ResponseBody Object errorResponse(Exception e) {  
  8.         logger.error("异常处理中心", e);  
  9.         return e;  
  10.     }  
  11. }  

6、生成的日志文件



工程下载地址:http://download.csdn.net/detail/wxwzy738/7409341




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值