zoukankan      html  css  js  c++  java
  • Log4j2 与 SpringMVC 整合

    log4j2不仅仅是log4j的简单升级,而是整个项目的重构。官网地址:http://logging.apache.org/log4j/2.x/,大家能够从官网的介绍看出它相比log4j第1代的种种长处。

    一、基本使用

    1.1 maven依赖项

    复制代码
     1         <dependency>
     2             <groupId>org.apache.logging.log4j</groupId>
     3             <artifactId>log4j-api</artifactId>
     4             <version>2.0.2</version>
     5         </dependency>
     6         <dependency>
     7             <groupId>org.apache.logging.log4j</groupId>
     8             <artifactId>log4j-core</artifactId>
     9             <version>2.0.2</version>
    10         </dependency>
    复制代码

    1.2 Hello world演示样例

    复制代码
     1 package com.cnblogs.yjmyzz;
     2 
     3 import org.apache.logging.log4j.LogManager;
     4 import org.apache.logging.log4j.Logger;
     5 
     6 /**
     7  * Hello world!
     8  * 
     9  */
    10 public class App {
    11     static Logger logger = LogManager.getLogger(LogManager.ROOT_LOGGER_NAME);
    12 
    13     public static void main(String[] args) {
    14         logger.trace("trace message");
    15         logger.debug("debug message");
    16         logger.info("info message");
    17         logger.warn("warn message");
    18         logger.error("error message");
    19         logger.fatal("fatal message");
    20         System.out.println("Hello World!");
    21     }
    22 }
    复制代码

    在没有不论什么配置的情况下,log4j2会使用默认配置:

    复制代码
     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <Configuration status="WARN">
     3     <Appenders>
     4         <Console name="Console" target="SYSTEM_OUT">
     5             <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
     6         </Console>
     7     </Appenders>
     8     <Loggers>
     9         <Root level="error">
    10             <AppenderRef ref="Console" />
    11         </Root>
    12     </Loggers>
    13 </Configuration>
    复制代码

    该配置仅仅有一个Appender:Console,目标是SYSTEM_OUT。即日志内容,都会打印在eclipse控制台上。

    Root Logger的级别是error,即:全部error及以上级别的日志才会记录。(注:日志级别顺序为 TRACE < DEBUG < INFO < WARN < ERROR < FATAL ),所以终于仅仅有2日志会输出(error,fatal)

    1 13:07:56.099 [main] ERROR  - error message
    2 13:07:56.100 [main] FATAL  - fatal message
    3 Hello World!

    配置第1行中的status="WARN"。能够去掉,它的含义为是否记录log4j2本身的event信息,默认是OFF。设置成“WARN”指:全部log4j2的event信息中,仅仅有WARN及以上级别的信息才记录,大家能够把它改成TRACE试试(最低级别),看下输出内容有何变化。

    另:配置文件通常命名为log4j2.xml,执行时仅仅要在classpath下能找到就可以。

    1.3 文件方式记录日志

    真正应用中,很多其它的是以纯文本文件的方式来记录系统的执行日志。来看一段略微复杂点的配置

    复制代码
     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <Configuration status="off" monitorInterval="1800">
     3 
     4     <properties>
     5         <property name="LOG_HOME">logs/sample</property>
     6         <property name="FILE_NAME">mylog</property>
     7     </properties>
     8 
     9     <Appenders>
    10         <Console name="Console" target="SYSTEM_OUT">
    11             <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
    12         </Console>
    13 
    14         <RollingRandomAccessFile name="running-log"
    15             fileName="${LOG_HOME}/${FILE_NAME}.log" filePattern="${LOG_HOME}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd}-%i.log.gz">
    16             <PatternLayout
    17                 pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %level [%thread][%file:%line] - %msg%n" />
    18             <Policies>
    19                 <TimeBasedTriggeringPolicy />
    20                 <SizeBasedTriggeringPolicy size="10 MB" />
    21             </Policies>
    22             <DefaultRolloverStrategy max="20" />
    23         </RollingRandomAccessFile>
    24     </Appenders>
    25     
    26     <Loggers>
    27         <Logger name="com.cnblogs.yjmyzz.App2" level="trace"
    28             additivity="true">
    29             <AppenderRef ref="running-log" />
    30         </Logger>
    31         <Root level="error">
    32             <AppenderRef ref="Console" />
    33         </Root>
    34     </Loggers>
    35 </Configuration>
    复制代码

     解释一下:

    第1行中的 monitorInterval="1800" 指log4j2每隔1800秒(半小时)。自己主动监控该配置文件是否有变化。假设变化。则自己主动依据文件内容又一次配置(非常不错的功能。)

    4-7行定义了一些属性(能够依据须要自己随便加入)。主要是为了后面引用起来方便

    14行 RollingRandomAccessFile  即表示以文件方式记录,注意一下filePattern 的设置,它与20行的SizeBasedTriggeringPolicy (表示单个文件最大多少容量)结合在一起,非常实用。以这段配置为例,当单个文件达到10M后。会自己主动将曾经的内容,先创建相似 2014-09(年-月)的文件夹,然后按 "xxx-年-月-日-序号"命名。打成压缩包(非常体贴的设计,即省了空间,又不丢失曾经的日志信息)

    22行的DefaultRolloverStrategy max="20"表示压缩包,最多保留20个

    27-30行,定义了一个新logger。它的级别是trace 。使用文件方式来记录日志。additivity="true" 这里注意一下。由于以下另一个root logger,不论什么其它的logger终于都相当于继承自root logger,所以“com.cnblogs.yjmyzz.App2”这个logger中,假设记录了error及以上级别的日志,除了文件中会记录外,root logger也会生效。即:控制台也会输出一次。假设把additivity="true" 中的true,改成false,root logger就不会再起作用,即仅仅会记录在文件中,控制台无输出。

    另外关于logger的命名。非常有讲究的,这里我们命名为com.cnblogs.yjmyzz.App2。假设正好有这样一个类:

    log4j2是依据名称来用哪个logger的。第8行没有传不论什么參数,默认这个logger的name就是当前类的全称,即 com.cnblogs.yjmyzz.App2。这样就跟配置相应上了。所以刚才配置中的 nam="com.cnblogs.yjmyzz.App2"的logger,相当于仅仅对App2这一个类起作用。

    很多其它关于logger name继承的规则,请參考log4j2的官方pdf文档

     

    二、与Spring MVC 的整合

    2.1 maven依赖项

    复制代码
     1 <properties>
     2         <java.version>1.6</java.version>
     3         <springframework.version>3.2.8.RELEASE</springframework.version>
     4         <log4j2.version>2.0.2</log4j2.version>
     5     </properties>
     6     <dependencies>
     7         <!-- Spring -->
     8         <dependency>
     9             <groupId>org.springframework</groupId>
    10             <artifactId>spring-core</artifactId>
    11             <version>${springframework.version}</version>
    12         </dependency>
    13         <dependency>
    14             <groupId>org.springframework</groupId>
    15             <artifactId>spring-beans</artifactId>
    16             <version>${springframework.version}</version>
    17         </dependency>
    18         <dependency>
    19             <groupId>org.springframework</groupId>
    20             <artifactId>spring-context</artifactId>
    21             <version>${springframework.version}</version>
    22         </dependency>
    23         <dependency>
    24             <groupId>org.springframework</groupId>
    25             <artifactId>spring-web</artifactId>
    26             <version>${springframework.version}</version>
    27         </dependency>
    28         <dependency>
    29             <groupId>org.springframework</groupId>
    30             <artifactId>spring-webmvc</artifactId>
    31             <version>${springframework.version}</version>
    32         </dependency>
    33         <dependency>
    34             <groupId>org.springframework</groupId>
    35             <artifactId>spring-expression</artifactId>
    36             <version>${springframework.version}</version>
    37         </dependency>
    38 
    39         <!-- log4j2 -->
    40         <dependency>
    41             <groupId>org.apache.logging.log4j</groupId>
    42             <artifactId>log4j-api</artifactId>
    43             <version>${log4j2.version}</version>
    44         </dependency>
    45         <dependency>
    46             <groupId>org.apache.logging.log4j</groupId>
    47             <artifactId>log4j-core</artifactId>
    48             <version>${log4j2.version}</version>
    49         </dependency>
    50         <dependency>
    51             <groupId>org.apache.logging.log4j</groupId>
    52             <artifactId>log4j-web</artifactId>
    53             <version>2.0.2</version>
    54         </dependency>
    55     </dependencies>
    复制代码

    2.2 web.xml配置

    复制代码
     1 <?

    xml version="1.0" encoding="UTF-8"?

    > 2 <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 5 6 <context-param> 7 <param-name>contextConfigLocation</param-name> 8 <param-value>/WEB-INF/spring/root-context.xml</param-value> 9 </context-param> 10 <listener> 11 <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 12 </listener> 13 14 <!-- log4j2-begin --> 15 <listener> 16 <listener-class>org.apache.logging.log4j.web.Log4jServletContextListener</listener-class> 17 </listener> 18 <filter> 19 <filter-name>log4jServletFilter</filter-name> 20 <filter-class>org.apache.logging.log4j.web.Log4jServletFilter</filter-class> 21 </filter> 22 <filter-mapping> 23 <filter-name>log4jServletFilter</filter-name> 24 <url-pattern>/*</url-pattern> 25 <dispatcher>REQUEST</dispatcher> 26 <dispatcher>FORWARD</dispatcher> 27 <dispatcher>INCLUDE</dispatcher> 28 <dispatcher>ERROR</dispatcher> 29 </filter-mapping> 30 <!-- log4j2-end --> 31 32 <filter> 33 <filter-name>CharacterEncodingFilter</filter-name> 34 <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 35 <init-param> 36 <param-name>encoding</param-name> 37 <param-value>utf-8</param-value> 38 </init-param> 39 </filter> 40 <filter-mapping> 41 <filter-name>CharacterEncodingFilter</filter-name> 42 <url-pattern>/*</url-pattern> 43 </filter-mapping> 44 <servlet> 45 <servlet-name>appServlet</servlet-name> 46 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 47 <init-param> 48 <param-name>contextConfigLocation</param-name> 49 <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value> 50 </init-param> 51 <load-on-startup>1</load-on-startup> 52 </servlet> 53 <servlet-mapping> 54 <servlet-name>appServlet</servlet-name> 55 <url-pattern>/</url-pattern> 56 </servlet-mapping> 57 </web-app>

    复制代码

    注:这是web app 2.5的整合方法,web app3.0不须要这么复杂的配置,3.0的整合请參考官方pdf文档
    2.3 log4j2.xml

    内容前面那段“复杂的”配置差点儿相同,就不反复贴出来了

    放置在resources文件夹就可以,打包后,会自己主动拷贝到classpath下.

  • 相关阅读:
    Graph 学习
    忘记 mysql 8.0 root 密码 怎么修改
    HTML字符实体(关于&nbsp;&gt;&lt;等)
    Sqlserver 中系统表sysobjects、syscolumns以及函数object_id
    SQL Server创建索引(转)
    改善SQL语句(转)
    (转)SqlServer索引及优化详解(1)
    标签点击不返回顶部和不刷新页面方法
    c#模拟js escape方法
    获取枚举描述信息
  • 原文地址:https://www.cnblogs.com/jhcelue/p/7008563.html
Copyright © 2011-2022 走看看