spring mvc log日志由log4j桥接至log4j2

冷暖自知 提交于 2019-12-18 05:19:11

简介

spring mvc的日志系统可以配置很多版本,比如log4j、log4j2、logback等等,在参考资料中介绍了Spring mvc如何直接集成log4j2,我们这里介绍的是,如何将原系统中的log4j改为使用log4j2.

操作步骤

1. 删除原Spring mvc中对log4j的依赖

<exclusions>
	<exclusion>
		<groupId>log4j</groupId>
		<artifactId>log4j</artifactId>
	</exclusion>
</exclusions>

2、添加log4j2的依赖,其中og4j2的版本我选择的是, <log4j2.version>2.11.2</log4j2.version>,其中jul(java util logging)jcl (apache commons-logging)的依赖可以不用添加

<dependency>
	<groupId>org.apache.logging.log4j</groupId>
	<artifactId>log4j-api</artifactId>
	<version>${log4j2.version}</version>
</dependency>
<dependency>
	<groupId>org.apache.logging.log4j</groupId>
	<artifactId>log4j-core</artifactId>
	<version>${log4j2.version}</version>
</dependency>
<dependency>
	<groupId>org.apache.logging.log4j</groupId>
	<artifactId>log4j-jcl</artifactId>
	<version>${log4j2.version}</version>
</dependency>
<dependency>
	<groupId>org.apache.logging.log4j</groupId>
	<artifactId>log4j-jul</artifactId>
	<version>${log4j2.version}</version>
</dependency>
<dependency>
	<groupId>org.apache.logging.log4j</groupId>
	<artifactId>log4j-web</artifactId>
	<version>${log4j2.version}</version>
</dependency>

3、 添加log4j到log4j2的桥接包

<dependency>
	<groupId>org.apache.logging.log4j</groupId>
	<artifactId>log4j-1.2-api</artifactId>
	<version>${log4j2.version}</version>
</dependency>

4、添加log4j2的配置文件 log4j2.xml, 内容根据自己喜好更改,下面这个只是作为参考(直接在resources目录底下添加)

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <properties>
        <property name="LOG_HOME">logs/</property>
    </properties>
    <Appenders>

        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} 
- %msg%n"/>
        </Console>

        <RollingRandomAccessFile name="infoLog" fileName="${LOG_HOME}/app.log"
                                 filePattern="${LOG_HOME}/app.%d{yyyy-MM-dd}-%i.log.gz" append="true">
            <PatternLayout pattern="[%date{yyyy-MM-dd HH:mm:ss.SSS}][%thread]
[%level][%class][%line]:%message%n"/>
            <Filters>
                <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="NEUTRAL"/>
            </Filters>
            <Policies>
                <!-- 对应 filePattern维度,此处为天数-->
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
            </Policies>
            <DefaultRolloverStrategy max="30"/>
        </RollingRandomAccessFile>
    </Appenders>
    <Loggers>

        <!--mybatis debug log-->
        <AsyncLogger name="log4j.logger.org.mybatis" level="debug" additivity="false">
            <!--<appender-ref ref="Console"/>-->
            <AppenderRef ref="infoLog"/>
        </AsyncLogger>
        <AsyncLogger name="log4j.logger.java.sql" level="debug" additivity="false">
            <!--<appender-ref ref="Console"/>-->
            <AppenderRef ref="infoLog"/>
        </AsyncLogger>
        <AsyncLogger name="log4j.logger.java.sql.Connection" level="debug" additivity="false">
            <!--<appender-ref ref="Console"/>-->
            <AppenderRef ref="infoLog"/>
        </AsyncLogger>
        <AsyncLogger name="log4j.logger.java.sql.Statement" level="debug" additivity="false">
            <!--<appender-ref ref="Console"/>-->
            <AppenderRef ref="infoLog"/>
        </AsyncLogger>
        <AsyncLogger name="log4j.logger.java.sql.PreparedStatement" level="debug" additivity="false">
            <!--<appender-ref ref="Console"/>-->
            <AppenderRef ref="infoLog"/>
        </AsyncLogger>
        <AsyncLogger name="log4j.logger.java.sql.ResultSet" level="debug" additivity="false">
            <!--<appender-ref ref="Console"/>-->
            <AppenderRef ref="infoLog"/>
        </AsyncLogger>
        <!--TRACE、DEBUG、INFO、WARN、ERROR和FATAL-->
        <Root level="trace">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>

5、最重要的,其他的都不需要更改,比如mybatis-config.xml保留原样即可,不要将logImpl的value改为LOG4J2,不然,如果mybatis的版本如果过低的话,会报一些错误,比如:

Cause: org.apache.ibatis.logging.LogException: Error setting Log implementation.  Cause: java.lang.reflect.InvocationTargetException
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1628)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:742)
	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:866)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:542)
	at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:444)
	at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:326)
	at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107)
	at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4853)
	at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5314)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1408)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1398)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:748)
Caused by: org.springframework.core.NestedIOException: Failed to parse config resource: class path resource [mybatis-config.xml]; nested exception is org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: org.apache.ibatis.logging.LogException: Error setting Log implementation.  Cause: java.lang.reflect.InvocationTargetException
	at org.mybatis.spring.SqlSessionFactoryBean.buildSqlSessionFactory(SqlSessionFactoryBean.java:434)
	at org.mybatis.spring.SqlSessionFactoryBean.afterPropertiesSet(SqlSessionFactoryBean.java:340)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1687)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1624)
	... 21 more
Caused by: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: org.apache.ibatis.logging.LogException: Error setting Log implementation.  Cause: java.lang.reflect.InvocationTargetException
	at org.apache.ibatis.builder.xml.XMLConfigBuilder.parseConfiguration(XMLConfigBuilder.java:109)
	at org.apache.ibatis.builder.xml.XMLConfigBuilder.parse(XMLConfigBuilder.java:92)
	at org.mybatis.spring.SqlSessionFactoryBean.buildSqlSessionFactory(SqlSessionFactoryBean.java:428)
	... 24 more
Caused by: org.apache.ibatis.logging.LogException: Error setting Log implementation.  Cause: java.lang.reflect.InvocationTargetException
	at org.apache.ibatis.logging.LogFactory.setImplementation(LogFactory.java:131)
	at org.apache.ibatis.logging.LogFactory.useCustomLogging(LogFactory.java:83)
	at org.apache.ibatis.session.Configuration.setLogImpl(Configuration.java:213)
	at org.apache.ibatis.builder.xml.XMLConfigBuilder.settingsElement(XMLConfigBuilder.java:218)
	at org.apache.ibatis.builder.xml.XMLConfigBuilder.parseConfiguration(XMLConfigBuilder.java:103)
	... 26 more
Caused by: java.lang.reflect.InvocationTargetException
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
	at org.apache.ibatis.logging.LogFactory.setImplementation(LogFactory.java:127)
	... 30 more
Caused by: java.lang.NoClassDefFoundError: org/apache/logging/log4j/spi/AbstractLoggerWrapper
	at org.apache.ibatis.logging.log4j2.Log4j2AbstractLoggerImpl.<init>(Log4j2AbstractLoggerImpl.java:39)
	at org.apache.ibatis.logging.log4j2.Log4j2Impl.<init>(Log4j2Impl.java:34)
	... 35 more

其他情况

1、如果spring mvc中,log4j使用的是slf4j+log4j的模式,那么在执行上面第一步的时候,除了删除log4j的依赖外,还需要删除slf4j-log4j12的依赖

<exclusions>
	<exclusion>
		<groupId>log4j</groupId>
		<artifactId>log4j</artifactId>
	</exclusion>
	<exclusion>
		<artifactId>slf4j-log4j12</artifactId>
		<groupId>org.slf4j</groupId>
	</exclusion>
</exclusions>

在添加log4j2的依赖过程中,增加log4j2到slf4j的依赖包

<dependency>
  <groupId>org.apache.logging.log4j</groupId>
  <artifactId>log4j-slf4j-impl</artifactId>
  <version>${log4j2.version}</version>
</dependency>

2、简单介绍一下log4j2中依赖包的作用

log4j-api:log4j2定义的API

log4j-core:log4j2上述API的实现

log4j-1.2-api:将log4j日志转接到log4j2的转接包

log4j-jcl:commons-logging到log4j2的桥梁

log4j-jul:java util logging 到log4j2的桥梁

log4j-web:  保证容器关闭或取消部署Web应用程序时,正确清理日志资源(关闭数据库连接,关闭文件等)

log4j-slf4j-impl:slf4j到log4j2的桥梁

参考资料

Spring MVC + Slf4j + Log4j2 日志文件系统配置

What's New in Maven

slf4j与jul、log4j1、log4j2、logback的集成原理

关于slf4j log4j log4j2的jar包配合使用的那些事

Java日志框架:slf4j作用及其实现原理

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!