SpringBoot中统⼀⽇志解决⽅案
⽇志是整个系统中⾮常重要的⼀环,JAVA中也有很多⽇志框架,本⽂实现了在Spring Boot中利⽤logback和aop统⼀处理⽇志。本⽂⽐较简单,已记录为主O(∩_∩)O~
⾸先在resources⽬录下新建l作为logback的配置⽂件:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/l" />
<property name="LOG_HOME" value="/data/log" />
<!--<property name="LOG_HOME" value=" D:/data/log" />-->
<!--写⼊⽇志到控制台的appender,⽤默认的,但是要去掉charset,否则windows下tomcat下乱码-->
<appender name="CONSOLE" class="ch.ConsoleAppender">
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
<!--格式化输出:%d表⽰⽇期,%thread表⽰线程名,%-5level:级别从左显⽰5个字符宽度%msg:⽇志消息,%n是换⾏符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
</appender>
<!-- 滚动记录⽂件,先将⽇志记录到指定⽂件,当符合某个条件时,将⽇志记录到其他⽂件 -->
<appender name="StackRollingFileAppender" class="ch.olling.RollingFileAppender">
<File>${LOG_HOME}/vcash-order.log</File>
<rollingPolicy class="ch.olling.TimeBasedRollingPolicy">
<FileNamePattern>${LOG_HOME}/vcash-order.%d{yyyy-MM-dd}.log</FileNamePattern>
<!-- 最多保存60day⽇志⽂件 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<encoder>
<Pattern>%d{YYYY-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{35} - %msg %n</Pattern>
</encoder>
</appender>
<springProfile name="dev">
<root level="DEBUG">
<appender-ref ref="CONSOLE" />
<appender-ref ref="StackRollingFileAppender" />
</root>
</springProfile>
<springProfile name="test">
<root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="StackRollingFileAppender" />
</root>
</springProfile>
<springProfile name="prd">
<root level="INFO">
<appender-ref ref="StackRollingFileAppender" />
</root>
</springProfile>
</configuration>
可以看到,通过LOG_HOME这个property指定了⽇志存放的路径
通过springProfile指定了3种不同的环境,分别对应开发、测试和⽣产环境,在这⾥⾯指定了⽇志级别,并且引⽤了上⾯定义的两个appender
新建⼀个注解@Log:
@Documented
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Log {
}
新建⼀个aspect类,在该类中处理⽇志的记录:
@Aspect
@Component
public class VBSAspect {
private static final Logger log= Logger(VBSAspect.class);
@Pointcut("@annotation(com.vcash.wechat.annotation.Log)")
public void logPointcut(){}
@Around("logPointcut()")
public Object logHandler(ProceedingJoinPoint process) throws Throwable{
long startTime=System.currentTimeMillis();
MethodSignature methodSignature= (MethodSignature) Signature();
Method Method();
String Name();
String className= DeclaringClass().getName();
Object[] Args();
StringBuilder params=new StringBuilder();
for (int i = 0; i < args.length; i++) {
params.append(args[i].toString());
params.append(";");
}
Object result= null;
try {
result = process.proceed();
} catch (Throwable throwable) {
String Class()+":"+Message();
long costTime=System.currentTimeMillis()-startTime;
<("请求时间:{},请求耗时:{},请求类名:{},请求⽅法:{},请求参数:{},请求结果:{}",startTime,costTime,className,methodName,String(),exception);
return CustomerResponse.Message());
springboot aop}
long costTime=System.currentTimeMillis()-beginTime;
log.info("请求时间:{},请求耗时:{},请求类名:{},请求⽅法:{},请求参数:{},请求结果:{}",startTime,costTime,className,methodName,params. toString(), result);
return result;
}
}
可以看到,@Pointcut⾥指定了需要切⼊的地⽅为注解@Log存在的地⽅,⽽@Log⼜是注解在⽅法上的,所以在logHandler⽅法⾥,获取了@Log所注解⽅法的⼀系列参数,⽐如⽅法名、⼊参、出参、耗时等,并将这些参数以特定的格式写⼊⽇志,当然,你也可以在这⾥把⽇志写到数据库。
以上,就完成了整个系统⾥的⽇志处理,484⾮常简单~
再也不需要在每个类和⽅法⾥都引⼊⽇志代码,解耦了代码,⽅便了维护。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论