日志规范推荐

142 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

Maven依赖

在Spring boot中,只要引入如下依赖即可,可以按需使用相应的版本,推荐使用如下版本。

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.8</version>
</dependency>
<!-- SLF4J -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.21</version>
</dependency>
<!-- Logback -->
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-core</artifactId>
    <version>1.2.3</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.3</version>
</dependency>

application.properties 配置

#应用名
config.app.name=log-test
#日志目录 (生产环境推荐使用绝对路径 如/home/admin/logs)
config.app.log.dir=logs
#单个日志文件大小
config.app.log.file.max-size=200MB
#日志保留时间(天)
config.app.log.max-history=30
在项目的logback-spring.xml配置文件中引用yml中的变量.这样在package项目的时候,会根据启用不同的配置文件而读取上面定义好的日志输出地址

logback-spring.xml(推荐)

<?xml version="1.0" encoding="UTF-8"?>
<!-- 打开定时扫描新的配置信息,60s一次,开启log本身的debug日志,该日志量小,对性能影响很小 -->
<configuration scan="true" scanPeriod="5 seconds" debug="true">
 
    <!-- 配置参数 应用名 日志目录 单个日志文件最大大小 最长保留周期 -->
    <springProperty scope="SYSTEM" name="APP_NAME" source="config.app.name" defaultValue="dx"/>
    <springProperty scope="SYSTEM" name="LOG_HOME" source="config.app.log.dir" defaultValue="logs"/>
    <springProperty scope="SYSTEM" name="FILE_MAX_SIZE" source="config.app.log.file.max-size" defaultValue="200MB"/>
    <springProperty scope="SYSTEM" name="FILE_MAX_HISTORY" source="config.app.log.max-history" defaultValue="30"/>
 
 
    <!-- std控制台输出 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d|%5p|${PID}|%t|%-40.40logger{39} %M %L| %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>DEBUG</level>
            <onMatch>ACCEPT</onMatch>
        </filter>
    </appender>
 
    <!-- 所有文件日志 appender  -->
    <appender name="APP-LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>${LOG_HOME}/${APP_NAME}.log</File>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <FileNamePattern>${LOG_HOME}/${APP_NAME}.%d{yyyy-MM-dd}-%i.log.gz</FileNamePattern>
            <maxHistory>${FILE_MAX_HISTORY}</maxHistory>
            <maxFileSize>${FILE_MAX_SIZE}</maxFileSize>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder>
            <pattern>%d|%5p|${PID}|%t|%-40.40logger{39} %M %L| %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <!-- 接受DEBUG以上级别日志 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>DEBUG</level>
            <onMatch>ACCEPT</onMatch>
        </filter>
    </appender>
 
    <!-- request appender  -->
    <appender name="requestLogAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>${LOG_HOME}/request.log</File>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <FileNamePattern>${LOG_HOME}/requst.%d{yyyy-MM-dd}-%i.log</FileNamePattern>
            <maxHistory>${FILE_MAX_HISTORY}</maxHistory>
            <maxFileSize>${FILE_MAX_SIZE}</maxFileSize>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder>
            <pattern>%msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <!-- 仅接受INFO级别日志 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
 
 
    <!-- 根据实际情况设置不同框架、sdk等的日志级别,有利于排查问题 -->
    <logger name="com.dingxianginc" level="ERROR" additivity="false">
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="APP-LOG"/>
    </logger>
 
    <logger name="org.springframework" level="INFO" additivity="false">
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="APP-LOG"/>
    </logger>
    <logger name="org.apache.ibatis" level="DEBUG" additivity="false">
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="APP-LOG"/>
    </logger>
 
    <!-- 日志级别必须与requestLogAppender相匹配 -->
    <logger name="requestLogger" level="INFO" additivity="false">
        <!-- 必须引用接口日志requestLogAppender -->
        <appender-ref ref="requestLogAppender"/>
    </logger>
 
 
    <root>
        <!-- 修改level的值可以动态调整日志级别 -->
        <level value="DEBUG"/>
        <appender-ref ref="APP-LOG"/>
        <!--在ideal中测试时打开注释,上线部署时应该关闭-->
        <!--<appender-ref ref="STDOUT"/>-->
    </root>
 
 
</configuration>

Java代码中获取日志记录变量

一般日志推荐使用@Slf4j定义Logger日志变量,或者使用LoggerFactory.getLogger获得Logger日志变量

日志记录代码demo

@Slf4j
public class LogPrinter implements Runnable {
    //或者使用这个语句
    //private static final Logger log = LoggerFactory.getLogger(LogPrinter.class);
    @Override
    public void run() {
        if(log.isDebugEnabled()){
            log.debug("输出DEBUG日志,参数示例, id=[{}], name=[{}]", 1,"张三");
        }
        if(log.isInfoEnabled()){
            log.info("输出INFO日志,参数示例, id:[{}], name:[{}], 耗时:[{}]ms", 1,"张三", 7);
        }
        if(log.isWarnEnabled()){
            log.warn("输出WARN日志,参数示例, id:[{}], name:[{}], 耗时:[{}]ms, 耗时超过了常规时间", 1,"张三", 200);
        }
        if(log.isErrorEnabled()){
            log.error("输出ERROR日志,参数示例, id:[{}], name:[{}], 异常信息:", 1,"张三", 7, new IllegalArgumentException("参数不合法"));
        }
    }
}