Spring5 配置Log4j2日志输出,Mybatis设置

3,972 阅读3分钟

引言

之前项目用的是Log4j 1.x,log4j2是log4j 1.x和logback的改进版,据说采用了一些新技术(无锁异步、等等),使得日志的吞吐量、性能比log4j 1.x提高10倍,并解决了一些死锁的bug,而且配置更加简单灵活。

由于Spring4中log4j2的配置繁琐,索性连Spring也一起升级到了5,以下是基于Spring5.2.2.RELEASE进行配置。

1. pom.xml 依赖

添加以下依赖

<properties>
    <log4j2.version>2.12.1</log4j2.version>
</properties>


<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-api</artifactId>
    <version>${log4j2.version}</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-web</artifactId>
    <version>${log4j2.version}</version>
</dependency>

2. web.xml配置

  • 如果是servlet3.0可以省略listener的配置,如果是2.5则必须添加。
  • 日志文件名是log4j2.xml,这里我放在了src/main/resources/下。
  • <listener>
        <listener-class>org.apache.logging.log4j.web.Log4jServletContextListener</listener-class>
    </listener>
    
    <context-param>
        <param-name>log4jConfiguration</param-name>
        <param-value>classpath:/log4j2.xml</param-value>
    </context-param>
        
        
    <context-param>
        <param-name>log4jContextName</param-name>
        <param-value>star</param-value>
    </context-param>
    
    <context-param>
        <param-name>log4jConfiguration</param-name>
        <param-value>classpath:/log4j2.xml</param-value>
    </context-param>
    

    3. log4j2.xml

    具体配置网上教程很多,这里就不再解释。

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE project>
    <Configuretion status="off">
    	<Properties>
    		<Property name="logdir">/var/log/siled/web</Property>
    		<Property name="logfile-app">web-app</Property>
    		<Property name="logfile-alm">web-alm</Property>
    		<Property name="logfile-ope">web-ope</Property>
    		<Property name="layout">%d %5p [%T]%c{1}#%M %m%n</Property>
    		<Property name="layout-alm">%d ALERM [%T]%c{1}#%M %m%n</Property>
    	</Properties>
    
    	<Appenders>
    		<Console name="stdout" target="SYSTEM_OUT">
    			<PatternLayout pattern="${layout}" />
    		</Console>
    
    		<RollingFile name="app" append="true"
    			fileName="${logdir}/${logfile-app}.log"
    			filePattern="${logdir}/${logfile-app}.%d{yyyyMMdd}.log">
    			<PatternLayout pattern="${layout}" />
    			<Policies>
    				<TimeBasedTriggeringPolicy />
    			</Policies>
    			<DefaultRolloverStrategy>
    				<Delete basePath="${logdir}" maxDepth="1">
    					<IfFileName glob="${logfile-app}.*.log" />
    					<IfLastModified age="31d" />
    				</Delete>
    			</DefaultRolloverStrategy>
    		</RollingFile>
    
    		<RollingFile name="alm" append="true"
    			fileName="${logdir}/${logfile-alm}.log"
    			filePattern="${logdir}/${logfile-alm}.%d{yyyyMMdd}.log">
    			<PatternLayout pattern="${layout-alm}" />
    			<Policies>
    				<TimeBasedTriggeringPolicy />
    			</Policies>
    			<DefaultRolloverStrategy>
    				<Delete basePath="${logdir}" maxDepth="1">
    					<IfFileName glob="${logfile-alm}.*.log" />
    					<IfLastModified age="31d" />
    				</Delete>
    			</DefaultRolloverStrategy>
    		</RollingFile>
    
    		<RollingFile name="ope" append="true"
    			fileName="${logdir}/${logfile-ope}.log"
    			filePattern="${logdir}/${logfile-ope}.%d{yyyyMMdd}.log">
    			<PatternLayout pattern="${layout}" />
    			<Policies>
    				<TimeBasedTriggeringPolicy />
    			</Policies>
    			<DefaultRolloverStrategy>
    				<Delete basePath="${logdir}" maxDepth="1">
    					<IfFileName glob="${logfile-ope}.*.log" />
    					<IfLastModified age="366d" />
    				</Delete>
    			</DefaultRolloverStrategy>
    		</RollingFile>
    
    	</Appenders>
    
    	<Loggers>
    		<Root level="debug">
    			<AppenderRef ref="stdout" level="debug"/>
    			<AppenderRef ref="app" level="info"/>
    			<AppenderRef ref="alm" level="error" />
    		</Root>
    		<Logger name="org.mybatis" level="trace"  additivity="false"></Logger>
    		<Logger name="org.springframework" level="info"  additivity="false"></Logger>
    		<Logger name="operation" level="info" additivity="false">
    			<AppenderRef ref="ope" />
    		</Logger>
    	</Loggers>
    </Configuretion>
    
    
    

    4. 使用Logger输出应用日志

    import org.apache.logging.log4j.LogManager;
    import org.apache.logging.log4j.Logger;
    
    private Logger logger = LogManager.getLogger(this.getClass());
    
    public class RequestInterceptor implements HandlerInterceptor {
    
    	@Override
    	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
    		
    		logger.info("username:{}" , request.getSession().getAttribute("username"));
    		logger.info("getRemoteUser:{}" , request.getRemoteUser());
    		logger.info("getRequestURI{}" , request.getRequestURI());
    		return true;
    	}
    }
    

    5.配置Mybatis

    以上只是输出了应用日志,但是SQL执行日志并没有输出。所以必须对Mybatis进行设置。

    5.1 配置SqlSessionFactory

    MybatisSqlSessionFactoryBean的configLocation属性设置为mybatis-config.xml的内容。注意,我这里用的其实是Mybatis Plus,如果是普通的Mybatis就设置对应的SqlSessionFactory

    <bean id="sqlSessionFactoryBean"
    	class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean">
    	<property name="dataSource" ref="basicDataSource" />
    	<property name="mapperLocations" value="classpath:dao/siled/*.xml" />
    	// 添加这一句
    	<property name="configLocation" value="classpath:/mybatis-config.xml"></property>
    </bean>
    

    5.2配置mybatis-config.xml

    src/main/resources下创建mybatis-config.xml,写入以下配置。

    <?xml version="1.0" encoding="UTF-8" ?>  
    <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">  
    <configuration>
        <settings>
        	<setting name="logImpl" value="LOG4J2" />
        </settings>
    </configuration>
    

    这样SQL也能正常输出了。来看一下效果。

    2019-12-13 16:56:38,577 DEBUG [55]DataSourceTransactionManager#getTransaction Creating new transaction with name [com.cuts.siled.service.impl.demo.DemoMybatisPlusServiceImpl.selectByMap]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT
    2019-12-13 16:56:39,056 DEBUG [55]DataSourceTransactionManager#doBegin Acquired Connection [765858464, URL=jdbc:postgresql://localhost:5432/postgres, UserName=siled, PostgreSQL JDBC Driver] for JDBC transaction
    2019-12-13 16:56:39,065 DEBUG [55]DataSourceTransactionManager#doBegin Switching JDBC Connection [765858464, URL=jdbc:postgresql://localhost:5432/postgres, UserName=siled, PostgreSQL JDBC Driver] to manual commit
    2019-12-13 16:56:39,087 DEBUG [55]SqlSessionUtils#debug Creating a new SqlSession
    2019-12-13 16:56:39,102 DEBUG [55]SqlSessionUtils#debug Registering transaction synchronization for SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@18d6733]
    2019-12-13 16:56:39,190 DEBUG [55]SpringManagedTransaction#debug JDBC Connection [765858464, URL=jdbc:postgresql://localhost:5432/postgres, UserName=siled, PostgreSQL JDBC Driver] will be managed by Spring
    2019-12-13 16:56:39,197 DEBUG [55]selectByMap#debug ==>  Preparing: SELECT username,password,auth,updts FROM m_user WHERE auth = ? AND deleted='0' 
    2019-12-13 16:56:39,203 DEBUG [55]selectByMap#debug ==> Parameters: admin(String)
    2019-12-13 16:56:39,262 DEBUG [55]selectByMap#debug <==      Total: 1