1.利用spring-aop实现日志自动化
1.1添加相关依赖(spring-aop,aspectj)
<span style="white-space:pre"> </span><dependency>
<span style="white-space:pre"> </span><groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.5.4</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.9</version>
</dependency>
1.2 spring-mvc.xml添加配置
<span style="white-space:pre"> </span><aop:aspectj-autoproxy proxy-target-class="true"/>
这条配置是将自动生成代理,
proxy-target-class="true"配置是为实现类生成代理,若不加此项只能为接口生成代理
1.3 配置切面
@Component
@Aspect
public class LogAspect {
private Log log = LogFactory.getLog(LogAspect.class);
@Pointcut("execution(* com.jiechengkeji.manager..*(..))")
public void aspect() {
}
@Around("aspect()")
public Object around(ProceedingJoinPoint point) {
long start = System.currentTimeMillis();
String uuid = UUID.randomUUID().toString();//由于开始记录和结束记录会错开,用UUID进行配对
String before = String.format("%s.%s()--ARGS:%s (%s)",
point.getTarget().getClass().getSimpleName(),
MethodSignature.class.cast(point.getSignature()).getMethod().getName(),
Arrays.toString(point.getArgs()),
uuid);
log.info(before);
Object result = null;
try {
result = point.proceed();
} catch (Throwable e) {
log.error(e);
}
String after = String.format("%s.%s()--RETURNS:%s TIME:%s ms (%s)",
point.getTarget().getClass().getSimpleName(),
MethodSignature.class.cast(point.getSignature()).getMethod().getName(),
result,
System.currentTimeMillis() - start,
uuid);
log.info(after);
return result;
}
}
没啥说的 基本上看代码就能明白,不要忘记添加@Component注解。之前我以为和 @Controller,@Service一样是包含@Component注解的,没想到不是,排查了很长时间。
1.4 配置logback.xml
<!-- aop记日志的appender -->
<appender name="aop" class="ch.qos.logback.core.rolling.RollingFileAppender">
<FileNamePattern>${log.base}/${log.methodModuleName}%d{yyyy-MM-dd}.%i.log</FileNamePattern> <!-- 设置日志不超过${log.max.size}时的保存路径,注意如果
是web项目会保存到Tomcat的bin目录 下 -->
<!-- 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件。 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${log.base}/${log.methodModuleName}%d{yyyy-MM-dd}.%i.log.zip
</FileNamePattern>
<!-- 文件输出日志 (文件大小策略进行文件输出,超过指定大小对文件备份) -->
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${log.max.size}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<!-- 日志输出的文件的格式 -->
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>%date{HH:mm:ss} [%-5level] %msg%n</Pattern>
</layout>
</appender>
<span style="white-space:pre"> </span><logger name="com.jiechengkeji.manager.aop.LogAspect" additivity="false">
<span style="white-space:pre"> </span><level value="INFO" />
<span style="white-space:pre"> </span><appender-ref ref="aop" />
<span style="white-space:pre"> </span></logger>
2.1 调整mybatis的config.xml
<settings>
<setting name="logPrefix" value="dao."/> <!-- dao. 是logger的name .不可省略-->
<setting name="cacheEnabled" value="false" />
<setting name="defaultExecutorType" value="REUSE" />
<setting name="logImpl" value="COMMONS_LOGGING" />
</settings>
2.2 调整logback.xml
<logger name="dao" level="DEBUG">
<!--daoFILE为实际定义的appender-->
<appender-ref ref="aop" />
</logger>
3.效果
1.@Pointcut("execution(* com.jiechengkeji.manager..*(..))")中定义的每一个切入点 执行前执行后都会打印日志
2.mybatis的日志信息也会打印到aop appender指定的文件中
示例:
</pre>13:12:35 [INFO ] CityService.getCityNameById()--ARGS:[-1] (48ded28b-2773-4846-897e-ef14beee273b)13:12:35 [DEBUG] ooo Using Connection [ProxyConnection[PooledConnection[com.mysql.jdbc.JDBC4Connection@386f61ed]]]13:12:35 [DEBUG] ==> Preparing: select name from dy_city where id = ? ; 13:12:35 [DEBUG] ==> Parameters: -1(Integer)13:12:35 [DEBUG] <== Total: 013:12:35 [INFO ] CityService.getCityNameById()--RETURNS:null TIME:8 ms (48ded28b-2773-4846-897e-ef14beee273b)13:12:35 [INFO ] LoginController.doLogin()--RETURNS:com.jiechengkeji.manager.util.AsyncResult@23b16363 TIME:339 ms (15ab451d-fa2e-42e1-adbe-54e106d77705)<p></p><div style="top:1283px"><pre name="code" class="html"> @Pointcut("execution(* com.jiechengkeji.manager..*(..))")