说明:最经工作需要涉及到了log4j的相关知识,记录下自己是如何运用的,方便下次忘了便于参考。
目的:将不同级别的日志存储到指定的文件中。
问题:一开始准备直接套用老系统中log4j.properties配置,将properties文件导过来,配置好web.xml文件,启动服务惊奇的发现报错了,提示找不到Log4jConfigListener,查看了下原因,老系统的spring版本为3.1.0.RELEASE,新的系统中用的是5.1.5.RELEASE,通过Log4jConfigListener权限定名查看,在5.1.5.RELEASE版本中压根就没有这个了,好吧,查资料找解决办法吧,原来spring建议用log4j2 来替换这个类。
<!-- 原web.xml中配置-->
<!-- 定义LOG4J监听器 -->
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
<!-- log4jConfigLocation:log4j配置文件存放路径 -->
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>classpath:log4j.properties</param-value>
</context-param>
log4j2配置:
1、导入jar包:log4j-api.jar,log4j-code.jar,log4j-web.jar(包的版本没有做具体的研究,我用的2.11.1)
2、配置web.xml:需将下面内容配置在web.xml最前面,网上介绍说防止日志不打印的问题,没太深究,尴尬………………
<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:以下是我使用的一个测试用的log4j2.xml配置,亲测可用(完善后的xml配置见https://blog.csdn.net/freedom_fire/article/details/89536729,文档仅供参考,不喜勿喷)
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="off" monitorInterval="1800">
<properties>
<property name="FILE_NAME">ubs</property>
</properties>
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<ThresholdFilter level="WARN" onMatch="ACCEPT" onMismatch="DENY" />
<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n" />
</Console>
<File name="info" fileName="${web:rootDir}/../../ubslogs/info.log" append="true">
<Filters>
<ThresholdFilter level="WARN" onMatch="DENY" onMismatch="NEUTRAL" />
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY" />
</Filters>
<PatternLayout pattern="%d{yyyy.MM.dd HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n" />
</File>
<File name="error" fileName="${web:rootDir}/../../ubslogs/error.log" append="true">
<Filters>
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY" />
</Filters>
<PatternLayout pattern="%d{yyyy.MM.dd HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n" />
</File>
</Appenders>
<Loggers>
<Root level="trace" additivity="false">
<!-- 这里是输入到控制台-->
<AppenderRef ref="Console"/>
<!-- 这里是输入到文件,很重要-->
<AppenderRef ref="info"/>
<AppenderRef ref="error"/>
</Root>
</Loggers>
</Configuration>
4、代码逻辑
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@Controller
@RequestMapping(value="/test")
public class Test {
private static final Logger logger = LogManager.getLogger(Test.class);
@RequestMapping(value="/test",method = RequestMethod.GET)
public String test() {
logger.info("info……………………………………");
logger.warn("warn……………………………………");
logger.error("error……………………………………");
logger.fatal("fatal……………………………………");
return "HelloWorld";
}
}
ok,至此,验证完毕了,没有问题。
参考文档:
https://blog.csdn.net/zhiyuzhe/article/details/78850238
https://www.cnblogs.com/hyyq/p/7171227.html
https://blog.csdn.net/womeng2009/article/details/53510913
https://blog.csdn.net/cnwyt/article/details/79298423
https://bglmmz.iteye.com/blog/2154490