当前位置: 首页 > 工具软件 > OK Log > 使用案例 >

spring5取消Log4jConfigListener,运用Log4jServletContextListener代替(log4j2.xml的配置)

徐隐水
2023-12-01

说明:最经工作需要涉及到了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

 

 类似资料: