开发日志规范-2022

开发日志规范

1、使用门面日志框架SLF4J

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory;
private static final Logger logger = LoggerFactory.getLogger(Abc.class);

2、日志历史个数、大小

<property name="log.maxHistory" value="15"/>
<property name="log.maxSize" value="10MB"/>

3、使用占位符连接日志

正确:

logger.info("Processing trade with id: {} and symbol : {} ", id, symbol);

错误:

logger.info("Processing trade with id: " + id + " symbol: " + symbol);

4、避免重复打印日志,设置 additivity=false

    <logger name="${log.sql.class.package.path}" level="info" additivity="false">
        <appender-ref ref="sql_Log"/>
    </logger>

5、必须输出异常日志,并使用logger.error(msg,e)

正确

logger.error(msg,e)

错误

logger.error(msg,e.getMessage())

6、如果输出debug日志,必须加是否debug判断

if (logger.isDebugEnabled()) { 
logger.debug("Processing trade with id: " + id + " symbol: " + symbol); 
}

7、必要之处必须输出日志

输出日志的目的是为了便于排查问题
日志内容加关键字,可以便于过滤日志。

8、谨慎记录日志

生产环境禁止输出 debug 日志
响应结果日志中可以输出结果状态,不要输出结果文本
关闭sql日志
access日志尽量输出请求参数,但是post的大文本除外。
正确使用日志级别
应在循环外部总计日志,尽量不要在循环内部记录日志,特殊情况除外。

9、禁止

使用 `System.out.print`
使用 `e.printStackTrace()`
抛出异常后又输出日志

logback 日志配置

环境

springboot、mybatis-plus、slf4j

sql日志输出

a、application.properties或application.yaml

mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.slf4j.Slf4jImpl
logging.level.com.searchserver.dao.fin.mapper=debug

b、DataSource Config java代码

configuration.setLogImpl(Slf4jImpl.class);

c、logback.xml中的sql日志单独输出

    <!--dao层包下的类的日志输出-->
    <logger name="${log.sql.class.package.path}" level="info" additivity="false">
        <appender-ref ref="sql_Log"/>
    </logger>

logback中其他项配置

项目描述
log.home_dir日志文件根目录
log.app_name日志文件项目目录,不同的项目存放到不同的目录中
log.access.class.package.pathrest请求package路径
log.sql.class.package.pathsql mapper的package路径
log.level日志级别,通常为info,要输出debug日志,请设置为debug

注意事项

1、错误日志独立输出,并输出到主日志

    <!-- error日志独立输出,并输出到主日志 -->
    <!--name的内容会影响主日志输出-->
    <logger name="com"  level="info" additivity="true">
        <appender-ref ref="ERROR"/>
    </logger>

logback.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
    <jmxConfigurator/>

    <property name="log.home_dir" value="/data/logs"/>
    <property name="log.app_name" value="searchserver"/>
    <property name="log.access.class.package.path" value="com.searchserver.interceptor"/>
    <property name="log.sql.class.package.path" value="com.searchserver.dao.fin.mapper" />
    <property name="log.level" value="info"/>
     
    <property name="log.maxHistory" value="30"/>
    <property name="log.maxSize" value="10MB"/>
   
    <!-- ConsoleAppender 控制台输出日志 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>
                %d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] [%thread] %logger - %msg%n
            </pattern>
        </encoder>
    </appender>
    
    <appender name="main_Log" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${log.home_dir}/${log.app_name}/all-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
            <maxHistory>${log.maxHistory}</maxHistory>
            <MaxFileSize>${log.maxSize}</MaxFileSize>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %logger - %msg%n</pattern>
        </encoder>
    </appender>

    <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>
                ${log.home_dir}/${log.app_name}/error-%d{yyyy-MM-dd}-%i.log
            </fileNamePattern>
            <maxHistory>${log.maxHistory}</maxHistory>
            <MaxFileSize>${log.maxSize}</MaxFileSize>
        </rollingPolicy>
        <encoder>
            <pattern>
                %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
            </pattern>
        </encoder>
    </appender>
    
    <appender name="access_Log" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${log.home_dir}/${log.app_name}/access-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
            <maxHistory>${log.maxHistory}</maxHistory>
            <MaxFileSize>${log.maxSize}</MaxFileSize>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %logger - %msg%n</pattern>
        </encoder>
    </appender>
    
    <appender name="sql_Log" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${log.home_dir}/${log.app_name}/sql-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
            <maxHistory>${log.maxHistory}</maxHistory>
            <MaxFileSize>${log.maxSize}</MaxFileSize>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %logger - %msg%n</pattern>
        </encoder>
    </appender>
    
    <!-- rest请求日志 -->
    <logger name="${log.access.class.package.path}" level="info" additivity="false">
        <appender-ref ref="access_Log"/>
    </logger>
    
    <!--dao层包下的类的日志输出-->
    <logger name="${log.sql.class.package.path}" level="info" additivity="false">
        <appender-ref ref="sql_Log"/>
    </logger>
    
    <!-- error日志独立输出,并输出到主日志 -->
    <logger name="com"  level="info" additivity="true">
        <appender-ref ref="ERROR"/>
    </logger>
	
    <root>
        <level value="${log.level}"/>
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="main_Log"/>
    </root>

</configuration>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值