技术与架构之springmvc输入输出信息打印日志中

前言

同事在全部controller方法里加入了输入参数的log输出,输出数据的log输出或者使用aop的方式。真的很烦,鸟菜啊给你们一个简单的方式。html

先看错误的方式

手动添加log打印方式

@Slf4j
@RestController
public class UserController{

	@RequestMapping("getUserInfo")
	public UserInfo getUserInfo(Long userId ){
		log.info("------------->查询getUserInfo入参{}", id);
		xxxxxxxx
		log.info("------------->查询getUserInfo输出{}", xxx);
	}
	@RequestMapping("newGetUserInfo")
	public UserInfo getUserInfo(Long userId , Long appId){
	    log.info("------------->查询getUserInfo入参id: {} , appId:{}", id, appId);
		xxxxxxxx
		log.info("------------->查询getUserInfo输出{}", xxxx);
	}
}
问题
  1. 每一个类都须要加入@Slf4j注解,问题不大。若是不须要打印,那么能够不要,要还有一个报警,真烦
  2. 每一个方法声明下与return以前都要写输入输出的代码,这个工做量也不小
  3. 多个入参,打印很是麻烦,添加一个入参的时候须要修改,工做量大,容易出错
  4. 输入输出的字符串里面必须加入方法名,这个工做量也不小。在你复制方法的时候也须要修改,挺烦。添加方法名时容易出错,修改时忘记修改。容易出错
  5. 日志级别不容易控制,必须是info级别,不然会打印不少其余debug的日志,由于是info级别,当想关闭输入输出的时候,缺由于是还有大量关键信息是经过info级别打印到日志里面,因此不能关闭。
  6. 若是是使用debug级别打印输出输出,当controller的目录不同时,须要在日志文件的配置中,controller的日志级别为debug。容易忘记配置,出事,线上通常是关闭的。
总结

工做量大,代码不优雅(难看死了),日志信息与配置容易出错,配置很差管理java

aop实现

百度一下随便找一个spring aop实现日志输出的,麻烦你们点击下Spring AOP实现统一日志输出。是在不想万恶的重复造轮子程序员

问题
  1. 须要基于Spring AOP实现统一日志输出,并且很是健壮,没有问题。并且很是健壮,没有问题。并且很是健壮,没有问题。
  2. 须要启动Spring AOP实现统一日志输出
  3. 须要配置aop的切面,若是controller目录不同,需求添加与修改切面点,容易出错
  4. 不基于jar依赖的话,须要把Spring AOP实现统一日志输出的代码每一个项目复制一份,超级麻烦,容易出错。
  5. 当你的Spring AOP实现统一日志输出,修改得时候,须要把全部项目jar的依赖修改,若是是复制代码的方式,那更加麻烦
  6. 若是是jar依赖,须要多一个依赖,做为管理洁癖者十分很差。若是是经过代码的方式,可能不须要修改了代码出问题,项目目录里面会出现一个aop目录,鸟菜啊会烦死去,业务代码里面。只有那些业务目录,不该该出现功能目录。并且尽可能保证目录的简单
总结

管理很是麻烦,容易出错,须要必定功底的程序员维护,成本大,代价大。web

鸟菜啊的解决方案

第一步引入依赖
<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
		</dependency>
		<dependency>
			<groupId>ch.qos.logback</groupId>
			<artifactId>logback-core</artifactId>
		</dependency>
		<dependency>
			<groupId>ch.qos.logback</groupId>
			<artifactId>logback-access</artifactId>
		</dependency>
		<dependency>
			<groupId>ch.qos.logback</groupId>
			<artifactId>logback-classic</artifactId>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>jcl-over-slf4j</artifactId>
		</dependency>
第二步配置输入输出
<logger name="org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod" level="trace" />
第三步看效果
2019-10-21 12:02:18.640 [http-nio-12140-exec-2] TRACEo.s.w.s.m.m.a.ServletInvocableHandlerMethod - Invoking 'com.xxx.UserController.getUserInfo' with arguments [1]

2019-10-21 12:02:18.920 [http-nio-12140-exec-2] TRACEo.s.w.s.m.m.a.ServletInvocableHandlerMethod - Method [com.xxx.UserController.getUserInfo] returned [xxxx]

缺点

  1. 打印的数据有点长
  2. 没有办法把多个log输出合成一个
  3. 要么一块儿关闭,一块儿打开,没有办法灵活下

优势

  1. 优雅
  2. 简单
  3. 无侵入

侃大山下

  1. 效果怎么样,欢迎你们评价下,谢谢
  2. 感受怎么样,欢迎你们说说,谢谢
  3. 三个方式的比较怎么样,你们说说谢谢
  4. 鸟菜啊,为何会使用这个方式,你们也能够说说
相关文章
相关标签/搜索