springmvc,mybatis,logback整合相关

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. 整合mybatis

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..*(..))")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值