引言
之前项目用的是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配置
<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