1、pom.xml文件中添加Log4j2的相关Maven配置信息
<!-- log4j2 --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.1</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.1</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-web</artifactId> <version>2.1</version> </dependency>
2、web.xml文件中添加Log4j2的相关配置信息
<!-- log4j --> <context-param> <param-name>isLog4jAutoInitializationDisabled</param-name> <param-value>false</param-value> </context-param> <!-- 默认就会找这个文件,不需要额外配置引用 <context-param> <param-name>log4jConfiguration</param-name> <param-value>classpath:/log4j2.xml</param-value> </context-param> --> <listener> <listener-class>org.apache.logging.log4j.web.Log4jServletContextListener</listener-class> </listener> <filter> <filter-name>log4jServletFilter</filter-name> <filter-class>org.apache.logging.log4j.web.Log4jServletFilter</filter-class> </filter> <filter-mapping> <filter-name>log4jServletFilter</filter-name> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> <dispatcher>INCLUDE</dispatcher> <dispatcher>ERROR</dispatcher> </filter-mapping>
3、添加log4j2.xml文件,具体配置参考下面文件内容
<?xml version="1.0" encoding="UTF-8"?> <!-- log4j2使用说明(create By SeanXiao ): 使用方式如下: private static final Logger logger = LogManager.getLogger(实际类名.class.getName()); 2、日志说明: (1)请根据实际情况配置各项参数 (2)需要注意日志文件备份数和日志文件大小,注意预留目录空间 (3)实际部署的时候backupFilePatch变量需要修改成linux目录 --> <configuration status="error"> <Properties> <Property name="fileName">front.log</Property> <Property name="backupFilePatch">d:/usr/front/log/</Property> </Properties> <!--先定义所有的appender--> <appenders> <!--这个输出控制台的配置--> <Console name="Console" target="SYSTEM_OUT"> <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)--> <ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY" /> <!--这个都知道是输出日志的格式--> <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n" /> </Console> <!--这个会打印出所有的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档--> <RollingFile name="RollingFile" fileName="${backupFilePatch}${fileName}" filePattern="${backupFilePatch}$${date:yyyy-MM}/app-%d{yyyyMMddHHmmssSSS}.log.gz"> <PatternLayout pattern="%d{yyyy.MM.dd 'at' HH:mm:ss.SSS z} %-5level %class{36} %L %M - %msg%xEx%n" /> <!-- 日志文件大小 --> <SizeBasedTriggeringPolicy size="20MB" /> <!-- 最多保留文件数 --> <DefaultRolloverStrategy max="20"/> </RollingFile> </appenders> <!--然后定义logger,只有定义了logger并引入的appender,appender才会生效--> <loggers> <!--建立一个默认的root的logger--> <Logger name="com.lhyl.front" level="trace" additivity="true"> <AppenderRef ref="RollingFile" /> </Logger> <Root level="error"> <AppenderRef ref="Console" /> </Root> </loggers> </configuration>
4、使用方法跟log4j一样,在使用类中添加下面对象初始化,然后在关键位置调用 logger.error\debug等等。。。
private static final Logger logger = LogManager.getLogger(实际类名.class.getName());
二版本:
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下.