WANG LH , Research & Development

日志的使用

2021.05.31 22:05

日志的使用

记录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>