日志的使用
记录log是有很多种方式,这里记下个人认为最方便的一种,使用注解@Slf4j
https://logging.apache.org/log4j/2.x/index.html
https://projectlombok.org/features/log
@Slf4j 简化日志声明
idea需要安装lombok插件, lombok是个好东西,多研究研究多看看。lombok
项目依赖lombok包
annotationProcessor("org.projectlombok:lombok")
使用方式:
@RestController
@RequestMapping(value = "/api/example")
@Slf4j
public class ExampleController {
@GetMapping(value = "/response/body/rewrite")
public List<String> testResponseBodyRewrite() {
log.info("first slf4j log test :{}", "hello world");
return Lists.newArrayList("hello", "world");
}
}
日志文件配置log4j2
参考这篇文章 https://www.cnblogs.com/new-life/p/9246143
平时搭建项目可以直接参考项目常用配置
归类日志文件
比如将api请求统一输入api.log文件中,数据库文件放到dao.log, rpc请求放到rpc.log中。
这里以api为例看下配置的流程,其他类似。
log4j2.xml中配置api的appender和logger,参考项目常用配置
要统一请求的日志,建个自己的拦截器ApiLogInterceptor
要将拦截器注册到spring中,注册拦截器
自定义appender
有时框架提供的appender可能不够满足我们的需求,就需要根据自己的需求去定制,比如将错误log输入到钉钉或者飞书当中做日志监控,方便第一时间发现问题。
主要思想是继承AbstractAppender,可以看看其他子类是怎么实现的,比如FileAppender。完整配置参看自定义appender
log4j2.xml中要配置package,告诉自定以的appender在哪个包下,项目启动时才会去加载这个appender。
<?xml version="1.0" encoding="UTF-8"?>
<!-- 会自动加载packages里自定义的的日志appender -->
<Configuration status="WARN" packages="com.sea.common.helper">
<Properties>
<Property name="log.dir">logs</Property>
<Property name="pattern">%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p %t %c{1}:%L - %m%n</Property>
<Property name="pattern.simple">%d{yyyy-MM-dd HH:mm:ss,SSS} %m%n</Property>
</Properties>
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="${pattern}"/>
</Console>
<!-- 自定义appender -->
<!-- default -->
<RollingFile name="default" fileName="${log.dir}/default.log" filePattern="${log.dir}/default.log.%d{yyyyMMdd}">
<PatternLayout pattern="${pattern}"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
</Policies>
</RollingFile>
<!-- error -->
<RollingFile name="error" fileName="${log.dir}/error.log" filePattern="${log.dir}/error.log.%d{yyyyMMdd}">
<PatternLayout pattern="${pattern}"/>
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
</Policies>
</RollingFile>
<!-- api -->
<RollingFile name="api" fileName="${log.dir}/api.log" filePattern="${log.dir}/api.log.%d{yyyyMMdd}">
<PatternLayout pattern="${pattern.simple}"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
</Policies>
</RollingFile>
<!--自定义appender-->
<Sea name="custom">
<PatternLayout pattern="${pattern}"/>
</Sea>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="default"/>
<AppenderRef ref="error"/>
</Root>
<Logger name="log.api" level="INFO" additivity="false">
<AppenderRef ref="api"/>
</Logger>
<Logger name="custom.sea" level="INFO" additivity="false">
<AppenderRef ref="custom"/>
<AppenderRef ref="Console"/>
</Logger>
</Loggers>
</Configuration>