springmvc+log4j.xml操作日志记录,详细配置




目录(?)[+]


  1. 模式转换字符
  2. 格式修饰符




原文地址:

参考地址:http://rockelixir.iteye.com/blog/1902352


需要导入包:

 log包:log4j-12.17.jar

第一步:web.xml配置



[html] view plain copy


print

?


1. <!– log4j配置,文件路径,因为是跟随项目启动 –>
2. <context-param>
3. <param-name>log4jConfigLocation</param-name>
4. <param-value>/WEB-INF/log4j.xml</param-value>
5. </context-param>
6. <!– 配置log4j.xml变量,如果需要动态的就使用下面方式,使用方法${name} –>
7. <context-param>
8. <param-name>controller</param-name>
9. <param-value>controller-log</param-value>
10. </context-param>
11.   
12. <context-param>
13. <param-name>loggingLevel</param-name>
14. <param-value>info</param-value>
15. </context-param>
16. <!– 加载log4j配置文件 –>
17. <listener>
18. <listener-class>org.springframework.web.util.Log4jConfigListener  
19. </listener-class>
20. </listener>



<!-- log4j配置,文件路径,因为是跟随项目启动 -->
<context-param>
    <param-name>log4jConfigLocation</param-name>
    <param-value>/WEB-INF/log4j.xml</param-value>
</context-param>
<!-- 配置log4j.xml变量,如果需要动态的就使用下面方式,使用方法${name} -->
<context-param>
    <param-name>controller</param-name>
    <param-value>controller-log</param-value>
</context-param>

<context-param>
    <param-name>loggingLevel</param-name>
    <param-value>info</param-value>
</context-param>
<!-- 加载log4j配置文件 -->
<listener>
    <listener-class>org.springframework.web.util.Log4jConfigListener
    </listener-class>
</listener>



第二步log4j.xml配置

(配置文件可以有两种方式,一种是xml,一种是properties。个人比较喜欢xml,一目了然)

先讲解一下核心对象:

logger对象: Logger对象负责捕获日志信息及它们存储在一个空间的层次结构。

Appender对象:下位层提供Appender对象。Appender对象负责发布日志信息,以不同的首选目的地,如数据库,文件,控制台,UNIX系统日志等。

layout对象: 该层提供其用于格式化不同风格的日志信息的对象。布局层提供支持Appender对象到发布日志信息之前。

打个比方:logger是个情报站,负责收集他 所在地方(用name=”xxx包”指定)下的所有信息。appender是发送出去的方式,如写信(FileAppender)、电报(SMTPAppender)等多种。layout就是发送内容以什么格式书写,如自定义格式(PatternLayout),html(HTMLLayout)格式。





[html] view plain copy


print

?

1. <?xml version=“1.0” encoding=“UTF-8”?>
2. <!DOCTYPE log4j:configuration PUBLIC ”-//APACHE//DTD LOG4J 1.2//EN” “log4j.dtd”>
3. <log4j:configuration xmlns:log4j=“http://jakarta.apache.org/log4j/”>
4. <!– 可以配置多个appender来对应不同的输出,如文件输出,sql输出,控制台输出,邮件输出等 –>
5. <!– [控制台STDOUT] 不同的输出类型对应着不同的calss,如控制台输出class对应着 org.apache.log4j.ConsoleAppender –>
6. <appender name=“console” class=“org.apache.log4j.ConsoleAppender”>  <!– name提供给logger或者root调用 –>
7. <param name=“encoding” value=“GBK” />  <!– 保存字符集 –>
8. <param name=“target” value=“System.out” />  <!– 输出到控制台 –>
9. <layout class=“org.apache.log4j.PatternLayout”> <!– loyout表示输出方式,可以多种,class值区分,PatternLayout表示自定义格式 –>
10. <param name=“ConversionPattern” value=“%d{ISO8601} 耗时:%r [日志来自:%-40.40c{3} 日志类型: %-5p 日志内容:%m]%n” />  <!– 输出格式,后面解释 –>
11. </layout>
12. < DEBUG < INFO < WARN < ERROR < FATAL < OFF
13.           所有下面输出的是debug到warn不会有error和fatal  
14. >
15. <filter class=“org.apache.log4j.varia.LevelRangeFilter”>
16. <param name=“levelMin” value=“debug” />
17. <param name=“levelMax” value=“warn” />
18. <param name=“AcceptOnMatch” value=“true” />  <!– 答案: –>
19. </filter>
20. </appender>
21.     
22. <!– [公共Appender] 这个class表示输入到文件,并且按日期生成新文件–>
23. <appender name=“DEFAULT-APPENDER” class=“org.apache.log4j.DailyRollingFileAppender”>
24. <param name=“File” value=“{webapp.root}/logs/common-default.log"</span><span> </span><span >/></span><span>  </span><span ><!--  />  <!-- {webapp.root}项目根路径,自动获得,不用配置,可自己在web.xml中配置 –>
25. <param name=“Append” value=“true” />  <!– 是否项目重启继续保存之前日志 –>
26. <param name=“encoding” value=“GBK” />
27. <param name=“threshold” value=“all” /> <!– 记录所有类型日志,记录它和比它等级高的日志all<debug –>
28. <param name=“DatePattern” value=“’.’yyyy-MM-dd’.log’” />  <!– 日期格式  例子:common-default.log.2015-09-17.log–>
29. <layout class=“org.apache.log4j.PatternLayout”>  <!– 输出方式 –>
30. <param name=“ConversionPattern” value=“%d{ISO8601} 耗时:%r [日志来自:%-40.40c{3} 日志类型: %-5p 日志内容:%m]%n” />
31. </layout>
32. </appender>
33.     
34. <!– [debug日志APPENDER] –>
35. <appender name=“DEBUG-APPENDER” class=“org.apache.log4j.DailyRollingFileAppender”>
36. <param name=“File” value=“{webapp.root}/logs/controller/debug-log.log"</span><span> </span><span >/></span><span>    </span></span></li><li ><span>     <span ><</span><span >param</span><span> </span><span >name</span><span>=</span><span >"Append"</span><span> </span><span >value</span><span>=</span><span >"true"</span><span> </span><span >/></span><span>    </span></span></li><li class=""><span>     <span ><</span><span >param</span><span> </span><span >name</span><span>=</span><span >"encoding"</span><span> </span><span >value</span><span>=</span><span >"GBK"</span><span> </span><span >/></span><span>    </span></span></li><li ><span>     <span ><</span><span >param</span><span> </span><span >name</span><span>=</span><span >"DatePattern"</span><span> </span><span >value</span><span>=</span><span >"'.'yyyy-MM-dd'.log'"</span><span> </span><span >/></span><span>    </span></span></li><li class=""><span>     <span ><</span><span >layout</span><span> </span><span >class</span><span>=</span><span >"org.apache.log4j.PatternLayout"</span><span >></span><span>    </span></span></li><li ><span>        <span ><</span><span >param</span><span> </span><span >name</span><span>=</span><span >"ConversionPattern"</span><span> </span><span >value</span><span>=</span><span >"%d{ISO8601} 耗时:%r [日志来自:%-40.40c{3} 日志类型: %-5p 日志内容:%m]%n"</span><span> </span><span >/></span><span>    </span></span></li><li class=""><span>     <span ></</span><span >layout</span><span >></span><span>    </span></span></li><li ><span>   <span ></</span><span >appender</span><span >></span><span>    </span></span></li><li class=""><span>     </span></li><li ><span>   <span ><!-- [info日志APPENDER] --></span><span>    </span></span></li><li class=""><span>   <span ><</span><span >appender</span><span> </span><span >name</span><span>=</span><span >"INFO-APPENDER"</span><span>    </span></span></li><li ><span><span >class</span><span>=</span><span >"org.apache.log4j.DailyRollingFileAppender"</span><span >></span><span>    </span></span></li><li class=""><span>     <span ><</span><span >param</span><span> </span><span >name</span><span>=</span><span >"File"</span><span> </span><span >value</span><span>=</span><span >" />    
37. <param name="Append" value="true" />    
38. <param name="encoding" value="GBK" />    
39. <param name="DatePattern" value="'.'yyyy-MM-dd'.log'" />    
40. <layout class="org.apache.log4j.PatternLayout">    
41. <param name="ConversionPattern" value="%d{ISO8601} 耗时:%r [日志来自:%-40.40c{3} 日志类型: %-5p 日志内容:%m]%n" />    
42. </layout>    
43. </appender>    
44.      
45. <!-- [info日志APPENDER] -->    
46. <appender name="INFO-APPENDER"    
47. class="org.apache.log4j.DailyRollingFileAppender">    
48. <param name="File" value="{webapp.root}/logs/controller/info-log.log” />
49. <param name=“Append” value=“false” />
50. <param name=“encoding” value=“GBK” />
51. <param name=“DatePattern” value=“’.’yyyy-MM-dd’.log’” />
52. <layout class=“org.apache.log4j.PatternLayout”>
53. <param name=“ConversionPattern” value=“%d{ISO8601} 耗时:%r [日志来自:%-40.40c{3} 日志类型: %-5p 日志内容:%m]%n” />
54. </layout>
55. <!– 我只想记录info日志,就做如下设置 –>
56. <filter class=“org.apache.log4j.varia.LevelRangeFilter”>
57. <param name=“LevelMax” value=“info”/>
58. <param name=“LevelMin” value=“info”/>
59. </filter>
60. </appender>
61.   
62. <!– [组件日志APPENDER] –>
63. <appender name=“COMPONENT-APPENDER”
64. class=“org.apache.log4j.DailyRollingFileAppender”>
65. <param name=“File” value=“{webapp.root}/logs/logistics-component.log"</span><span> </span><span >/></span><span>    </span></span></li><li class=""><span>     <span ><</span><span >param</span><span> </span><span >name</span><span>=</span><span >"Append"</span><span> </span><span >value</span><span>=</span><span >"true"</span><span> </span><span >/></span><span>    </span></span></li><li ><span>     <span ><</span><span >param</span><span> </span><span >name</span><span>=</span><span >"encoding"</span><span> </span><span >value</span><span>=</span><span >"GBK"</span><span> </span><span >/></span><span>    </span></span></li><li class=""><span>     <span ><</span><span >param</span><span> </span><span >name</span><span>=</span><span >"DatePattern"</span><span> </span><span >value</span><span>=</span><span >"'.'yyyy-MM-dd'.log'"</span><span> </span><span >/></span><span>    </span></span></li><li ><span>     <span ><</span><span >layout</span><span> </span><span >class</span><span>=</span><span >"org.apache.log4j.PatternLayout"</span><span >></span><span>    </span></span></li><li class=""><span>    <span ><</span><span >param</span><span> </span><span >name</span><span>=</span><span >"ConversionPattern"</span><span> </span><span >value</span><span>=</span><span >"%d{ISO8601} 耗时:%r [日志来自:%-40.40c{3} 日志类型: %-5p 日志内容:%m]%n"</span><span> </span><span >/></span><span>    </span></span></li><li ><span>     <span ></</span><span >layout</span><span >></span><span>    </span></span></li><li class=""><span>   <span ></</span><span >appender</span><span >></span><span>    </span></span></li><li ><span>    </span></li><li class=""><span>     <span ><!-- debug log --></span><span>    </span></span></li><li ><span>     <span ><!-- name指定的是包名,表示这个logger只记录com.wzw.controller下的所有日志 --></span><span>  </span></span></li><li class=""><span>   <span ><</span><span >logger</span><span> </span><span >name</span><span>=</span><span >"com.wzw.controller"</span><span> </span><span >additivity</span><span>=</span><span >"true"</span><span >></span><span>  </span><span ><!-- additivity 是否继承root --></span><span>  </span></span></li><li ><span>      <span ><!-- <level value=" />    
66. <param name="Append" value="true" />    
67. <param name="encoding" value="GBK" />    
68. <param name="DatePattern" value="'.'yyyy-MM-dd'.log'" />    
69. <layout class="org.apache.log4j.PatternLayout">    
70. <param name="ConversionPattern" value="%d{ISO8601} 耗时:%r [日志来自:%-40.40c{3} 日志类型: %-5p 日志内容:%m]%n" />    
71. </layout>    
72. </appender>    
73.     
74. <!-- debug log -->    
75. <!-- name指定的是包名,表示这个logger只记录com.wzw.controller下的所有日志 -->  
76. <logger name="com.wzw.controller" additivity="true">  <!-- additivity 是否继承root -->  
77. <!-- <level value="{loggingLevel}” />   –>
78. <level value=“DEBUG”></level>  <!– 现在级别 –>
79. <appender-ref ref=“DEBUG-APPENDER” />
80. </logger>
81.      
82. <!– info log –>
83. <!– name指定的是包名,这样只操作此包下的log –>
84. <logger name=“com.wzw.controller” additivity=“true”>
85. <level value=“INFO”></level>
86. <appender-ref ref=“INFO-APPENDER” />
87. <appender-ref ref=“console”/>
88. </logger>
89.      
90. <!– Root Logger –>
91. <!– 所有logger的父类,记录所有的日志。 –>
92. <root>
93. <level value=“ALL”></level>  <!– 限定记录等级 –>
94. <appender-ref ref=“DEFAULT-APPENDER” />  <!– 调用记录方式 –>
95. <appender-ref ref=“console”/>
96. </root>
97.      
98. </log4j:configuration>


<?xml version="1.0" encoding="UTF-8"?>    
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd">  
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<!-- 可以配置多个appender来对应不同的输出,如文件输出,sql输出,控制台输出,邮件输出等 -->  
  <!-- [控制台STDOUT] 不同的输出类型对应着不同的calss,如控制台输出class对应着 org.apache.log4j.ConsoleAppender -->  
  <appender name="console" class="org.apache.log4j.ConsoleAppender">  <!-- name提供给logger或者root调用 -->
     <param name="encoding" value="GBK" />  <!-- 保存字符集 -->
     <param name="target" value="System.out" />  <!-- 输出到控制台 -->
     <layout class="org.apache.log4j.PatternLayout"> <!-- loyout表示输出方式,可以多种,class值区分,PatternLayout表示自定义格式 --> 
       <param name="ConversionPattern" value="%d{ISO8601} 耗时:%r [日志来自:%-40.40c{3} 日志类型: %-5p 日志内容:%m]%n" />  <!-- 输出格式,后面解释 -->
     </layout>  
      <!--filter过滤器设置输出的级别:ALL < DEBUG < INFO < WARN < ERROR < FATAL < OFF
          所有下面输出的是debug到warn不会有error和fatal
      -->  
        <filter class="org.apache.log4j.varia.LevelRangeFilter">  
            <param name="levelMin" value="debug" />  
            <param name="levelMax" value="warn" />  
            <param name="AcceptOnMatch" value="true" />  <!-- 答案: -->
        </filter>  
  </appender>  

  <!-- [公共Appender] 这个class表示输入到文件,并且按日期生成新文件-->  
  <appender name="DEFAULT-APPENDER" class="org.apache.log4j.DailyRollingFileAppender">  
     <param name="File" value="${webapp.root}/logs/common-default.log" />  <!-- ${webapp.root}项目根路径,自动获得,不用配置,可自己在web.xml中配置 -->
     <param name="Append" value="true" />  <!-- 是否项目重启继续保存之前日志 -->
     <param name="encoding" value="GBK" />  
     <param name="threshold" value="all" /> <!-- 记录所有类型日志,记录它和比它等级高的日志all<debug -->
     <param name="DatePattern" value="'.'yyyy-MM-dd'.log'" />  <!-- 日期格式  例子:common-default.log.2015-09-17.log-->
     <layout class="org.apache.log4j.PatternLayout">  <!-- 输出方式 -->
    <param name="ConversionPattern" value="%d{ISO8601} 耗时:%r [日志来自:%-40.40c{3} 日志类型: %-5p 日志内容:%m]%n" />  
     </layout>  
   </appender>  

   <!-- [debug日志APPENDER] -->  
   <appender name="DEBUG-APPENDER" class="org.apache.log4j.DailyRollingFileAppender">  
     <param name="File" value="${webapp.root}/logs/controller/debug-log.log" />  
     <param name="Append" value="true" />  
     <param name="encoding" value="GBK" />  
     <param name="DatePattern" value="'.'yyyy-MM-dd'.log'" />  
     <layout class="org.apache.log4j.PatternLayout">  
        <param name="ConversionPattern" value="%d{ISO8601} 耗时:%r [日志来自:%-40.40c{3} 日志类型: %-5p 日志内容:%m]%n" />  
     </layout>  
   </appender>  

   <!-- [info日志APPENDER] -->  
   <appender name="INFO-APPENDER"  
class="org.apache.log4j.DailyRollingFileAppender">  
     <param name="File" value="${webapp.root}/logs/controller/info-log.log" />  
     <param name="Append" value="false" />  
     <param name="encoding" value="GBK" />
     <param name="DatePattern" value="'.'yyyy-MM-dd'.log'" />  
     <layout class="org.apache.log4j.PatternLayout">  
    <param name="ConversionPattern" value="%d{ISO8601} 耗时:%r [日志来自:%-40.40c{3} 日志类型: %-5p 日志内容:%m]%n" />  
     </layout> 
     <!-- 我只想记录info日志,就做如下设置 -->
     <filter class="org.apache.log4j.varia.LevelRangeFilter">     
       <param name="LevelMax" value="info"/>     
       <param name="LevelMin" value="info"/>     
      </filter>   
   </appender>  

    <!-- [组件日志APPENDER] -->  
   <appender name="COMPONENT-APPENDER"  
class="org.apache.log4j.DailyRollingFileAppender">  
     <param name="File" value="${webapp.root}/logs/logistics-component.log" />  
     <param name="Append" value="true" />  
     <param name="encoding" value="GBK" />  
     <param name="DatePattern" value="'.'yyyy-MM-dd'.log'" />  
     <layout class="org.apache.log4j.PatternLayout">  
    <param name="ConversionPattern" value="%d{ISO8601} 耗时:%r [日志来自:%-40.40c{3} 日志类型: %-5p 日志内容:%m]%n" />  
     </layout>  
   </appender>  

     <!-- debug log -->  
     <!-- name指定的是包名,表示这个logger只记录com.wzw.controller下的所有日志 -->
   <logger name="com.wzw.controller" additivity="true">  <!-- additivity 是否继承root -->
      <!-- <level value="${loggingLevel}" />   -->
      <level value="DEBUG"></level>  <!-- 现在级别 -->
      <appender-ref ref="DEBUG-APPENDER" />  
   </logger>  

     <!-- info log -->  
     <!-- name指定的是包名,这样只操作此包下的log -->
   <logger name="com.wzw.controller" additivity="true">  
      <level value="INFO"></level>  
      <appender-ref ref="INFO-APPENDER" />  
      <appender-ref ref="console"/>
   </logger>  

   <!-- Root Logger -->  
   <!-- 所有logger的父类,记录所有的日志。 -->
   <root> 
       <level value="ALL"></level>  <!-- 限定记录等级 -->
       <appender-ref ref="DEFAULT-APPENDER" />  <!-- 调用记录方式 -->
       <appender-ref ref="console"/>
   </root>  

</log4j:configuration>



运行就能看到common-default.log里面有操作日志


自己输出日志:

我controller包下某各类中:



[html] view plain copy


print

?


1. package com.wzw.controller;  
2. import org.apache.logging.log4j.LogManager;  
3. import org.apache.logging.log4j.Logger;  
4. import org.springframework.stereotype.Controller;  
5. import org.springframework.web.bind.annotation.ExceptionHandler;  
6. import org.springframework.web.bind.annotation.RequestMapping;  
7. @Controller  
8. @RequestMapping(“/account”)  
9. public class AccountController {  
10. logger =LoggerFactory.getLogger(AccountController.class);  
11. @ResponseBody  
12.     @RequestMapping(“/login”)  
13.     public String login(HttpSession session){  
14.         logger.info(“请求登录”);  
15.         logger.debug(“debug”);  
16.         logger.warn(“warn”);  
17. }  
18. }



package com.wzw.controller;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/account")
public class AccountController {
    private static Logger logger =LoggerFactory.getLogger(AccountController.class);
@ResponseBody
    @RequestMapping("/login")
    public String login(HttpSession session){
        logger.info("请求登录");
        logger.debug("debug");
        logger.warn("warn");
}
}

访问这个controller,就会记录日志,因为有log4j中有两个logger配置记录controller包下的日志,所以输出到两个logger下<appender-ref>(输出方式)。

appender选项:

  • AppenderSkeleton
  • AsyncAppender
  • ConsoleAppender
  • DailyRollingFileAppender
  • ExternallyRolledFileAppender
  • FileAppender
  • JDBCAppender
  • JMSAppender
  • LF5Appender
  • NTEventLogAppender
  • NullAppender
  • RollingFileAppender
  • SMTPAppender
  • SocketAppender
  • SocketHubAppender
  • SyslogAppender
  • TelnetAppender
  • WriterAppender

 layout选项:

  • DateLayout
  • HTMLLayout
  • PatternLayout
  • SimpleLayout
  • XMLLayout

模式转换字符:

下表说明了以上模式使用的字符和所有其他字符,可以在自定义模式中使用:

转换字符

表示的意思

c

用于输出的记录事件的类别。例如,对于类别名称”a.b.c” 模式  %c{2} 会输出 “b.c”

C

用于输出呼叫者发出日志请求的完全限定类名。例如,对于类名 “org.apache.xyz.SomeClass”, 模式 %C{1} 会输出 “SomeClass”.

d

用于输出的记录事件的日期。例如, %d{HH:mm:ss,SSS} 或 %d{dd MMM yyyy HH:mm:ss,SSS}.

F

用于输出被发出日志记录请求,其中的文件名

l

用于将产生的日志事件调用者输出位置信息

L

用于输出从被发出日志记录请求的行号

m

用于输出使用日志事件相关联的应用程序提供的消息

M

用于输出发出日志请求所在的方法名称

n

输出平台相关的行分隔符或文字

p

用于输出的记录事件的优先级

r

用于输出毫秒从布局的结构经过直到创建日志记录事件的数目

t

用于输出生成的日志记录事件的线程的名称

x

用于与产生该日志事件的线程相关联输出的NDC(嵌套诊断上下文)

X

在X转换字符后面是键为的MDC。例如  X{clientIP} 将打印存储在MDC对键clientIP的信息

%

文字百分号 %%将打印%标志

格式修饰符:

默认情况下,相关资料原样输出。然而,随着格式修饰符的帮助下,可以改变最小字段宽度,最大字段宽度和对齐。

下表涵盖了各种各样的修饰符的情况:

 

Format modifier

left justify

minimum width

maximum width

注释

%20c

false

20

none

用空格左垫,如果类别名称少于20个字符长

%-20c

true

20

none

用空格右垫,如果类别名称少于20个字符长

%.30c

NA

none

30

从开始截断,如果类别名称超过30个字符长

%20.30c

false

20

30

用空格左侧垫,如果类别名称短于20个字符。但是,如果类别名称长度超过30个字符,那么从开始截断。

%-20.30c

true

20

30

用空格右侧垫,如果类别名称短于20个字符。但是,如果类别名称长度超过30个字符,那么从开始截断。

标签






document.getElementById("bdshell_js").src = "http://bdimg.share.baidu.com/static/js/shell_v2.js?cdnversion=" + Math.ceil(new Date()/3600000) 
  var fromjs = 
  
 ("#fromjs");
    if (fromjs.length > 0) {("#fromjs .markdown_views pre").addClass("prettyprint"); prettyPrint(); 
  
 ('pre.prettyprint code').each(function () {
                var lines =(this).text().split('\n').length; var 
  
 numbering=(' 
 
•  
  (this).addClass(′has−numbering′).parent().append(numbering); for (i = 1; i


需要导入包:

 log包:log4j-12.17.jar

第一步:web.xml配置

[html] view plain copy

print

?

1. <!– log4j配置,文件路径,因为是跟随项目启动 –>
2. <context-param>
3. <param-name>log4jConfigLocation</param-name>
4. <param-value>/WEB-INF/log4j.xml</param-value>
5. </context-param>
6. <!– 配置log4j.xml变量,如果需要动态的就使用下面方式,使用方法${name} –>
7. <context-param>
8. <param-name>controller</param-name>
9. <param-value>controller-log</param-value>
10. </context-param>
11.   
12. <context-param>
13. <param-name>loggingLevel</param-name>
14. <param-value>info</param-value>
15. </context-param>
16. <!– 加载log4j配置文件 –>
17. <listener>
18. <listener-class>org.springframework.web.util.Log4jConfigListener  
19. </listener-class>
20. </listener>



<!-- log4j配置,文件路径,因为是跟随项目启动 -->
<context-param>
    <param-name>log4jConfigLocation</param-name>
    <param-value>/WEB-INF/log4j.xml</param-value>
</context-param>
<!-- 配置log4j.xml变量,如果需要动态的就使用下面方式,使用方法${name} -->
<context-param>
    <param-name>controller</param-name>
    <param-value>controller-log</param-value>
</context-param>

<context-param>
    <param-name>loggingLevel</param-name>
    <param-value>info</param-value>
</context-param>
<!-- 加载log4j配置文件 -->
<listener>
    <listener-class>org.springframework.web.util.Log4jConfigListener
    </listener-class>
</listener>

第二步log4j.xml配置

(配置文件可以有两种方式,一种是xml,一种是properties。个人比较喜欢xml,一目了然)

先讲解一下核心对象:

logger对象: Logger对象负责捕获日志信息及它们存储在一个空间的层次结构。

Appender对象:下位层提供Appender对象。Appender对象负责发布日志信息,以不同的首选目的地,如数据库,文件,控制台,UNIX系统日志等。

layout对象: 该层提供其用于格式化不同风格的日志信息的对象。布局层提供支持Appender对象到发布日志信息之前。

打个比方:logger是个情报站,负责收集他 所在地方(用name=”xxx包”指定)下的所有信息。appender是发送出去的方式,如写信(FileAppender)、电报(SMTPAppender)等多种。layout就是发送内容以什么格式书写,如自定义格式(PatternLayout),html(HTMLLayout)格式。



[html] view plain copy


print

?

1. <?xml version=“1.0” encoding=“UTF-8”?>
2. <!DOCTYPE log4j:configuration PUBLIC ”-//APACHE//DTD LOG4J 1.2//EN” “log4j.dtd”>
3. <log4j:configuration xmlns:log4j=“http://jakarta.apache.org/log4j/”>
4. <!– 可以配置多个appender来对应不同的输出,如文件输出,sql输出,控制台输出,邮件输出等 –>
5. <!– [控制台STDOUT] 不同的输出类型对应着不同的calss,如控制台输出class对应着 org.apache.log4j.ConsoleAppender –>
6. <appender name=“console” class=“org.apache.log4j.ConsoleAppender”>  <!– name提供给logger或者root调用 –>
7. <param name=“encoding” value=“GBK” />  <!– 保存字符集 –>
8. <param name=“target” value=“System.out” />  <!– 输出到控制台 –>
9. <layout class=“org.apache.log4j.PatternLayout”> <!– loyout表示输出方式,可以多种,class值区分,PatternLayout表示自定义格式 –>
10. <param name=“ConversionPattern” value=“%d{ISO8601} 耗时:%r [日志来自:%-40.40c{3} 日志类型: %-5p 日志内容:%m]%n” />  <!– 输出格式,后面解释 –>
11. </layout>
12. < DEBUG < INFO < WARN < ERROR < FATAL < OFF
13.           所有下面输出的是debug到warn不会有error和fatal  
14. >
15. <filter class=“org.apache.log4j.varia.LevelRangeFilter”>
16. <param name=“levelMin” value=“debug” />
17. <param name=“levelMax” value=“warn” />
18. <param name=“AcceptOnMatch” value=“true” />  <!– 答案: –>
19. </filter>
20. </appender>
21.     
22. <!– [公共Appender] 这个class表示输入到文件,并且按日期生成新文件–>
23. <appender name=“DEFAULT-APPENDER” class=“org.apache.log4j.DailyRollingFileAppender”>
24. <param name=“File” value=“{webapp.root}/logs/common-default.log"</span><span> </span><span >/></span><span>  </span><span ><!--  />  <!-- {webapp.root}项目根路径,自动获得,不用配置,可自己在web.xml中配置 –>
25. <param name=“Append” value=“true” />  <!– 是否项目重启继续保存之前日志 –>
26. <param name=“encoding” value=“GBK” />
27. <param name=“threshold” value=“all” /> <!– 记录所有类型日志,记录它和比它等级高的日志all<debug –>
28. <param name=“DatePattern” value=“’.’yyyy-MM-dd’.log’” />  <!– 日期格式  例子:common-default.log.2015-09-17.log–>
29. <layout class=“org.apache.log4j.PatternLayout”>  <!– 输出方式 –>
30. <param name=“ConversionPattern” value=“%d{ISO8601} 耗时:%r [日志来自:%-40.40c{3} 日志类型: %-5p 日志内容:%m]%n” />
31. </layout>
32. </appender>
33.     
34. <!– [debug日志APPENDER] –>
35. <appender name=“DEBUG-APPENDER” class=“org.apache.log4j.DailyRollingFileAppender”>
36. <param name=“File” value=“{webapp.root}/logs/controller/debug-log.log"</span><span> </span><span >/></span><span>    </span></span></li><li ><span>     <span ><</span><span >param</span><span> </span><span >name</span><span>=</span><span >"Append"</span><span> </span><span >value</span><span>=</span><span >"true"</span><span> </span><span >/></span><span>    </span></span></li><li class=""><span>     <span ><</span><span >param</span><span> </span><span >name</span><span>=</span><span >"encoding"</span><span> </span><span >value</span><span>=</span><span >"GBK"</span><span> </span><span >/></span><span>    </span></span></li><li ><span>     <span ><</span><span >param</span><span> </span><span >name</span><span>=</span><span >"DatePattern"</span><span> </span><span >value</span><span>=</span><span >"'.'yyyy-MM-dd'.log'"</span><span> </span><span >/></span><span>    </span></span></li><li class=""><span>     <span ><</span><span >layout</span><span> </span><span >class</span><span>=</span><span >"org.apache.log4j.PatternLayout"</span><span >></span><span>    </span></span></li><li ><span>        <span ><</span><span >param</span><span> </span><span >name</span><span>=</span><span >"ConversionPattern"</span><span> </span><span >value</span><span>=</span><span >"%d{ISO8601} 耗时:%r [日志来自:%-40.40c{3} 日志类型: %-5p 日志内容:%m]%n"</span><span> </span><span >/></span><span>    </span></span></li><li class=""><span>     <span ></</span><span >layout</span><span >></span><span>    </span></span></li><li ><span>   <span ></</span><span >appender</span><span >></span><span>    </span></span></li><li class=""><span>     </span></li><li ><span>   <span ><!-- [info日志APPENDER] --></span><span>    </span></span></li><li class=""><span>   <span ><</span><span >appender</span><span> </span><span >name</span><span>=</span><span >"INFO-APPENDER"</span><span>    </span></span></li><li ><span><span >class</span><span>=</span><span >"org.apache.log4j.DailyRollingFileAppender"</span><span >></span><span>    </span></span></li><li class=""><span>     <span ><</span><span >param</span><span> </span><span >name</span><span>=</span><span >"File"</span><span> </span><span >value</span><span>=</span><span >" />    
37. <param name="Append" value="true" />    
38. <param name="encoding" value="GBK" />    
39. <param name="DatePattern" value="'.'yyyy-MM-dd'.log'" />    
40. <layout class="org.apache.log4j.PatternLayout">    
41. <param name="ConversionPattern" value="%d{ISO8601} 耗时:%r [日志来自:%-40.40c{3} 日志类型: %-5p 日志内容:%m]%n" />    
42. </layout>    
43. </appender>    
44.      
45. <!-- [info日志APPENDER] -->    
46. <appender name="INFO-APPENDER"    
47. class="org.apache.log4j.DailyRollingFileAppender">    
48. <param name="File" value="{webapp.root}/logs/controller/info-log.log” />
49. <param name=“Append” value=“false” />
50. <param name=“encoding” value=“GBK” />
51. <param name=“DatePattern” value=“’.’yyyy-MM-dd’.log’” />
52. <layout class=“org.apache.log4j.PatternLayout”>
53. <param name=“ConversionPattern” value=“%d{ISO8601} 耗时:%r [日志来自:%-40.40c{3} 日志类型: %-5p 日志内容:%m]%n” />
54. </layout>
55. <!– 我只想记录info日志,就做如下设置 –>
56. <filter class=“org.apache.log4j.varia.LevelRangeFilter”>
57. <param name=“LevelMax” value=“info”/>
58. <param name=“LevelMin” value=“info”/>
59. </filter>
60. </appender>
61.   
62. <!– [组件日志APPENDER] –>
63. <appender name=“COMPONENT-APPENDER”
64. class=“org.apache.log4j.DailyRollingFileAppender”>
65. <param name=“File” value=“{webapp.root}/logs/logistics-component.log"</span><span> </span><span >/></span><span>    </span></span></li><li class=""><span>     <span ><</span><span >param</span><span> </span><span >name</span><span>=</span><span >"Append"</span><span> </span><span >value</span><span>=</span><span >"true"</span><span> </span><span >/></span><span>    </span></span></li><li ><span>     <span ><</span><span >param</span><span> </span><span >name</span><span>=</span><span >"encoding"</span><span> </span><span >value</span><span>=</span><span >"GBK"</span><span> </span><span >/></span><span>    </span></span></li><li class=""><span>     <span ><</span><span >param</span><span> </span><span >name</span><span>=</span><span >"DatePattern"</span><span> </span><span >value</span><span>=</span><span >"'.'yyyy-MM-dd'.log'"</span><span> </span><span >/></span><span>    </span></span></li><li ><span>     <span ><</span><span >layout</span><span> </span><span >class</span><span>=</span><span >"org.apache.log4j.PatternLayout"</span><span >></span><span>    </span></span></li><li class=""><span>    <span ><</span><span >param</span><span> </span><span >name</span><span>=</span><span >"ConversionPattern"</span><span> </span><span >value</span><span>=</span><span >"%d{ISO8601} 耗时:%r [日志来自:%-40.40c{3} 日志类型: %-5p 日志内容:%m]%n"</span><span> </span><span >/></span><span>    </span></span></li><li ><span>     <span ></</span><span >layout</span><span >></span><span>    </span></span></li><li class=""><span>   <span ></</span><span >appender</span><span >></span><span>    </span></span></li><li ><span>    </span></li><li class=""><span>     <span ><!-- debug log --></span><span>    </span></span></li><li ><span>     <span ><!-- name指定的是包名,表示这个logger只记录com.wzw.controller下的所有日志 --></span><span>  </span></span></li><li class=""><span>   <span ><</span><span >logger</span><span> </span><span >name</span><span>=</span><span >"com.wzw.controller"</span><span> </span><span >additivity</span><span>=</span><span >"true"</span><span >></span><span>  </span><span ><!-- additivity 是否继承root --></span><span>  </span></span></li><li ><span>      <span ><!-- <level value=" />    
66. <param name="Append" value="true" />    
67. <param name="encoding" value="GBK" />    
68. <param name="DatePattern" value="'.'yyyy-MM-dd'.log'" />    
69. <layout class="org.apache.log4j.PatternLayout">    
70. <param name="ConversionPattern" value="%d{ISO8601} 耗时:%r [日志来自:%-40.40c{3} 日志类型: %-5p 日志内容:%m]%n" />    
71. </layout>    
72. </appender>    
73.     
74. <!-- debug log -->    
75. <!-- name指定的是包名,表示这个logger只记录com.wzw.controller下的所有日志 -->  
76. <logger name="com.wzw.controller" additivity="true">  <!-- additivity 是否继承root -->  
77. <!-- <level value="{loggingLevel}” />   –>
78. <level value=“DEBUG”></level>  <!– 现在级别 –>
79. <appender-ref ref=“DEBUG-APPENDER” />
80. </logger>
81.      
82. <!– info log –>
83. <!– name指定的是包名,这样只操作此包下的log –>
84. <logger name=“com.wzw.controller” additivity=“true”>
85. <level value=“INFO”></level>
86. <appender-ref ref=“INFO-APPENDER” />
87. <appender-ref ref=“console”/>
88. </logger>
89.      
90. <!– Root Logger –>
91. <!– 所有logger的父类,记录所有的日志。 –>
92. <root>
93. <level value=“ALL”></level>  <!– 限定记录等级 –>
94. <appender-ref ref=“DEFAULT-APPENDER” />  <!– 调用记录方式 –>
95. <appender-ref ref=“console”/>
96. </root>
97.      
98. </log4j:configuration>



<?xml version="1.0" encoding="UTF-8"?>    
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd">  
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<!-- 可以配置多个appender来对应不同的输出,如文件输出,sql输出,控制台输出,邮件输出等 -->  
  <!-- [控制台STDOUT] 不同的输出类型对应着不同的calss,如控制台输出class对应着 org.apache.log4j.ConsoleAppender -->  
  <appender name="console" class="org.apache.log4j.ConsoleAppender">  <!-- name提供给logger或者root调用 -->
     <param name="encoding" value="GBK" />  <!-- 保存字符集 -->
     <param name="target" value="System.out" />  <!-- 输出到控制台 -->
     <layout class="org.apache.log4j.PatternLayout"> <!-- loyout表示输出方式,可以多种,class值区分,PatternLayout表示自定义格式 --> 
       <param name="ConversionPattern" value="%d{ISO8601} 耗时:%r [日志来自:%-40.40c{3} 日志类型: %-5p 日志内容:%m]%n" />  <!-- 输出格式,后面解释 -->
     </layout>  
      <!--filter过滤器设置输出的级别:ALL < DEBUG < INFO < WARN < ERROR < FATAL < OFF
          所有下面输出的是debug到warn不会有error和fatal
      -->  
        <filter class="org.apache.log4j.varia.LevelRangeFilter">  
            <param name="levelMin" value="debug" />  
            <param name="levelMax" value="warn" />  
            <param name="AcceptOnMatch" value="true" />  <!-- 答案: -->
        </filter>  
  </appender>  

  <!-- [公共Appender] 这个class表示输入到文件,并且按日期生成新文件-->  
  <appender name="DEFAULT-APPENDER" class="org.apache.log4j.DailyRollingFileAppender">  
     <param name="File" value="${webapp.root}/logs/common-default.log" />  <!-- ${webapp.root}项目根路径,自动获得,不用配置,可自己在web.xml中配置 -->
     <param name="Append" value="true" />  <!-- 是否项目重启继续保存之前日志 -->
     <param name="encoding" value="GBK" />  
     <param name="threshold" value="all" /> <!-- 记录所有类型日志,记录它和比它等级高的日志all<debug -->
     <param name="DatePattern" value="'.'yyyy-MM-dd'.log'" />  <!-- 日期格式  例子:common-default.log.2015-09-17.log-->
     <layout class="org.apache.log4j.PatternLayout">  <!-- 输出方式 -->
    <param name="ConversionPattern" value="%d{ISO8601} 耗时:%r [日志来自:%-40.40c{3} 日志类型: %-5p 日志内容:%m]%n" />  
     </layout>  
   </appender>  

   <!-- [debug日志APPENDER] -->  
   <appender name="DEBUG-APPENDER" class="org.apache.log4j.DailyRollingFileAppender">  
     <param name="File" value="${webapp.root}/logs/controller/debug-log.log" />  
     <param name="Append" value="true" />  
     <param name="encoding" value="GBK" />  
     <param name="DatePattern" value="'.'yyyy-MM-dd'.log'" />  
     <layout class="org.apache.log4j.PatternLayout">  
        <param name="ConversionPattern" value="%d{ISO8601} 耗时:%r [日志来自:%-40.40c{3} 日志类型: %-5p 日志内容:%m]%n" />  
     </layout>  
   </appender>  

   <!-- [info日志APPENDER] -->  
   <appender name="INFO-APPENDER"  
class="org.apache.log4j.DailyRollingFileAppender">  
     <param name="File" value="${webapp.root}/logs/controller/info-log.log" />  
     <param name="Append" value="false" />  
     <param name="encoding" value="GBK" />
     <param name="DatePattern" value="'.'yyyy-MM-dd'.log'" />  
     <layout class="org.apache.log4j.PatternLayout">  
    <param name="ConversionPattern" value="%d{ISO8601} 耗时:%r [日志来自:%-40.40c{3} 日志类型: %-5p 日志内容:%m]%n" />  
     </layout> 
     <!-- 我只想记录info日志,就做如下设置 -->
     <filter class="org.apache.log4j.varia.LevelRangeFilter">     
       <param name="LevelMax" value="info"/>     
       <param name="LevelMin" value="info"/>     
      </filter>   
   </appender>  

    <!-- [组件日志APPENDER] -->  
   <appender name="COMPONENT-APPENDER"  
class="org.apache.log4j.DailyRollingFileAppender">  
     <param name="File" value="${webapp.root}/logs/logistics-component.log" />  
     <param name="Append" value="true" />  
     <param name="encoding" value="GBK" />  
     <param name="DatePattern" value="'.'yyyy-MM-dd'.log'" />  
     <layout class="org.apache.log4j.PatternLayout">  
    <param name="ConversionPattern" value="%d{ISO8601} 耗时:%r [日志来自:%-40.40c{3} 日志类型: %-5p 日志内容:%m]%n" />  
     </layout>  
   </appender>  

     <!-- debug log -->  
     <!-- name指定的是包名,表示这个logger只记录com.wzw.controller下的所有日志 -->
   <logger name="com.wzw.controller" additivity="true">  <!-- additivity 是否继承root -->
      <!-- <level value="${loggingLevel}" />   -->
      <level value="DEBUG"></level>  <!-- 现在级别 -->
      <appender-ref ref="DEBUG-APPENDER" />  
   </logger>  

     <!-- info log -->  
     <!-- name指定的是包名,这样只操作此包下的log -->
   <logger name="com.wzw.controller" additivity="true">  
      <level value="INFO"></level>  
      <appender-ref ref="INFO-APPENDER" />  
      <appender-ref ref="console"/>
   </logger>  

   <!-- Root Logger -->  
   <!-- 所有logger的父类,记录所有的日志。 -->
   <root> 
       <level value="ALL"></level>  <!-- 限定记录等级 -->
       <appender-ref ref="DEFAULT-APPENDER" />  <!-- 调用记录方式 -->
       <appender-ref ref="console"/>
   </root>  

</log4j:configuration>



运行就能看到common-default.log里面有操作日志


自己输出日志:

我controller包下某各类中:



[html] view plain copy


print

?


1. package com.wzw.controller;  
2. import org.apache.logging.log4j.LogManager;  
3. import org.apache.logging.log4j.Logger;  
4. import org.springframework.stereotype.Controller;  
5. import org.springframework.web.bind.annotation.ExceptionHandler;  
6. import org.springframework.web.bind.annotation.RequestMapping;  
7. @Controller  
8. @RequestMapping(“/account”)  
9. public class AccountController {  
10. logger =LoggerFactory.getLogger(AccountController.class);  
11. @ResponseBody  
12.     @RequestMapping(“/login”)  
13.     public String login(HttpSession session){  
14.         logger.info(“请求登录”);  
15.         logger.debug(“debug”);  
16.         logger.warn(“warn”);  
17. }  
18. }



package com.wzw.controller;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/account")
public class AccountController {
    private static Logger logger =LoggerFactory.getLogger(AccountController.class);
@ResponseBody
    @RequestMapping("/login")
    public String login(HttpSession session){
        logger.info("请求登录");
        logger.debug("debug");
        logger.warn("warn");
}
}

访问这个controller,就会记录日志,因为有log4j中有两个logger配置记录controller包下的日志,所以输出到两个logger下<appender-ref>(输出方式)。

appender选项:

  • AppenderSkeleton
  • AsyncAppender
  • ConsoleAppender
  • DailyRollingFileAppender
  • ExternallyRolledFileAppender
  • FileAppender
  • JDBCAppender
  • JMSAppender
  • LF5Appender
  • NTEventLogAppender
  • NullAppender
  • RollingFileAppender
  • SMTPAppender
  • SocketAppender
  • SocketHubAppender
  • SyslogAppender
  • TelnetAppender
  • WriterAppender

 layout选项:

  • DateLayout
  • HTMLLayout
  • PatternLayout
  • SimpleLayout
  • XMLLayout

模式转换字符:

下表说明了以上模式使用的字符和所有其他字符,可以在自定义模式中使用:

转换字符

表示的意思

c

用于输出的记录事件的类别。例如,对于类别名称”a.b.c” 模式  %c{2} 会输出 “b.c”

C

用于输出呼叫者发出日志请求的完全限定类名。例如,对于类名 “org.apache.xyz.SomeClass”, 模式 %C{1} 会输出 “SomeClass”.

d

用于输出的记录事件的日期。例如, %d{HH:mm:ss,SSS} 或 %d{dd MMM yyyy HH:mm:ss,SSS}.

F

用于输出被发出日志记录请求,其中的文件名

l

用于将产生的日志事件调用者输出位置信息

L

用于输出从被发出日志记录请求的行号

m

用于输出使用日志事件相关联的应用程序提供的消息

M

用于输出发出日志请求所在的方法名称

n

输出平台相关的行分隔符或文字

p

用于输出的记录事件的优先级

r

用于输出毫秒从布局的结构经过直到创建日志记录事件的数目

t

用于输出生成的日志记录事件的线程的名称

x

用于与产生该日志事件的线程相关联输出的NDC(嵌套诊断上下文)

X

在X转换字符后面是键为的MDC。例如  X{clientIP} 将打印存储在MDC对键clientIP的信息

%

文字百分号 %%将打印%标志

格式修饰符:

默认情况下,相关资料原样输出。然而,随着格式修饰符的帮助下,可以改变最小字段宽度,最大字段宽度和对齐。

下表涵盖了各种各样的修饰符的情况:

 

Format modifier

left justify

minimum width

maximum width

注释

%20c

false

20

none

用空格左垫,如果类别名称少于20个字符长

%-20c

true

20

none

用空格右垫,如果类别名称少于20个字符长

%.30c

NA

none

30

从开始截断,如果类别名称超过30个字符长

%20.30c

false

20

30

用空格左侧垫,如果类别名称短于20个字符。但是,如果类别名称长度超过30个字符,那么从开始截断。

%-20.30c

true

20

30

用空格右侧垫,如果类别名称短于20个字符。但是,如果类别名称长度超过30个字符,那么从开始截断。

标签