Spring 集成 log4j 2.x 实现日志管理:
1.pom.xml 引入 JAR 包依赖;
<!-- 添加slf4j依赖 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.25</version> </dependency> <!-- 添加log4j2依赖 --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.11.1</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.11.1</version> </dependency> <!-- web容器中需要添加log4j-web --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-web</artifactId> <version>2.11.1</version> </dependency> <!-- 桥接slf4j --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> <version>2.11.1</version> </dependency>
2.web.xml 中 添加配置;
<!-- 配置Log4j 2.x 日志框架 --> <!-- 配置到最前面 避免日志不能正常打印 --> <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.classpath 下创建 log4j2 配置文件,命名为 log4j2.xml;
<?xml version="1.0" encoding="UTF-8"?> <!-- status: 用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,会看到log4j2内部各种详细输出 monitorInterval: Log4j能够自动检测修改配置文件和重新配置本身,设置间隔秒数 --> <Configuration status="off" monitorInterval="1800"> <!-- 全局属性--> <Properties> <!-- 日志文件输出目录:输出到Tomcat根目录 --> <Property name="log.tomcat.path">${sys:catalina.home}</Property> <!-- 日志文件输出目录:输出到项目根目录 --> <Property name="log.web.path">${web:rootDir}</Property> <Property name="log.local.path">d:/logs/dongzz-security</Property> </Properties> <!-- 输出源 --> <Appenders> <!-- 日志级别从高到低:OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL --> <!-- 日志格式: %d{yyyy-MM-dd HH:mm:ss, SSS} : 日志生产时间 %p : 日志输出格式 %c : logger的名称 %m : 日志内容,即 logger.info("日志内容") %n : 换行符 %C : Java类名 %L : 日志输出所在行数 %M : 日志输出所在方法名 hostName : 本地机器名 hostAddress : 本地ip地址 --> <!-- 输出到控制台:输出DEBUG及以上级别的信息到 System.out --> <Console name="Console" target="SYSTEM_OUT"> <!-- 过滤规则 --> <!-- 输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) --> <!-- ACCEPT:日志会被立即处理,不再经过剩余过滤器 DENY:日志将立即被抛弃不再经过其他过滤器 NEUTRAL:有序列表里的下个过滤器接着处理日志 --> <ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY" /> <!-- 日志格式 --> <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n" /> <!-- <PatternLayout pattern="%5p [%t] %d{yyyy-MM-dd HH:mm:ss} (%F:%L) %m%n" /> --> </Console> <!-- INFO级别日志 设置日志格式并配置日志压缩格式,压缩文件独立放在一个文件夹内,日期格式不能为冒号,否则无法生成,因为文件名不允许有冒号 --> <RollingFile name="info_appender" immediateFlush="true" fileName="${log.local.path}/info.log" filePattern="${log.local.path}/info - %d{yyyy-MM-dd HH_mm_ss}.log.gz"> <!-- 日志格式 --> <PatternLayout> <pattern>%5p [%t] %d{yyyy-MM-dd HH:mm:ss} (%F:%L) %m%n</pattern> </PatternLayout> <!-- 压缩规则 --> <Policies> <!-- 每个日志文件最大2MB --> <SizeBasedTriggeringPolicy size="2MB" /> <!-- 如果启用此配置,则日志会按文件名生成新压缩文件,即如果filePattern配置的日期格式为 %d{yyyy-MM-dd HH},则每小时生成一个压缩文件,如果filePattern配置的日期格式为 %d{yyyy-MM-dd},则每天生成一个压缩文件 --> <TimeBasedTriggeringPolicy interval="1" modulate="true" /> </Policies> <!-- 过滤规则 --> <Filters> <!-- 仅仅输出 INFO 级别的日志 --> <ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL" /> <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY" /> </Filters> </RollingFile> </Appenders> <!-- 记录器 --> <Loggers> <!-- 全局日志记录器 --> <Root level="off" additivity="false"> <!-- 输出到控制台 --> <AppenderRef ref="Console"/> </Root> <!-- 自定义日志记录器 --> <!-- 禁止打印 指定包 日志 --> <!--<Logger name="org.springframework" level="off" />--> <!-- Logger 存在继承关系 Root是根节点 additivity: 是否继承 Root Logger 的 输出源 true:日志会在父Logger的输出源打印 false:日志仅在当前Logger的输出源打印 --> <Logger name="com.dongzz.security" level="INFO" additivity="false"> <!-- 打印到日志文件 --> <!--<AppenderRef ref="info_appender" />--> <!-- 打印到控制台 --> <AppenderRef ref="Console" /> </Logger> </Loggers> </Configuration>
4.测试:
package com.dongzz.security.log4j2; import com.dongzz.security.SpringBaseJunit; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.junit.Test; /** * 测试 Log4j 2.x 日志框架 */ public class Log4j2Test extends SpringBaseJunit { //日志记录器 public static final Logger logger = LogManager.getLogger(Log4j2Test.class);; @Test public void log4j2Test(){ logger.trace("===trace message"); logger.debug("===debug message"); logger.info("===info message"); logger.warn("===warn message"); logger.error("===error message"); logger.fatal("===fatal message"); System.out.println("This is log4j2 test!!!"); } }