springboot+logback日志规范


  •  

当前问题

项目采用springboot的框架集成了logback的日志配置方式,但是在使用中遇到了很多问题,同时也基于“立刻方能用好”的原则,对于logback与springboot的配置做了一些了解和其它项目的配置对比,结合当前项目的需求,及需要解决的问题的方案,记录于此。

  1. logback的日志配置统一采用/home/logs目录,但是基于本地测试时,Mac电脑没有权限写文件到/home目录,同时也不想写日志文件到本机
  2. 本地调试项目,需要将日志输出到终端查看接口执行流程,但是其它环境不能将日志输出到终端,频繁更改配置容易上线时疏漏
  3. 线上日志输出需要采用info级别,但是其他环境(dohko,pre)可能需要做debug输出,获取更多的日志信息,频繁更改日志级别容易导致上线时疏忽检查导致线上日志文件很大
  4. mybatis的sql输出只有在debug模式下才能输出,但是线上日志都是info级别,如何做到info级别的日志也能输出mybatis的sql日志
  5. 同一日志级别下,需要过滤项目依赖其它包的日志输出,或将其日志级别调低,甚至不输出

配置示例

logback-spring.xml
<?xml version="1.0" encoding="UTF-8"?> <configuration>                   <property name="log.directory" value="/home/logs/" />          <property name="log.context.name" value="shop-crm-service21" />          <property name="log.charset" value="UTF-8" />          <property name="log.maxHistory" value="30" />          <property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS}$$[%thread]$$%-5level{}$$shop-crm-service$$%msg%n" />          <property name="log.error.log.level" value="ERROR" />          <property name="log.async.queue.size" value="1024" />            <contextName>${log.context.name}contextName>            <springProfile name="local">                  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">             <encoder>                 <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{50}) - %yellow([%file:%line]) - %msg%npattern>                                  <charset>${log.charset}charset>             encoder>         appender>     springProfile>       <springProfile name="mu,dohko,pre,production">                           <appender name="ROLLING_FILE_DEFAULT" class="ch.qos.logback.core.rolling.RollingFileAppender">             <file>${log.directory}${log.context.name}/${HOSTNAME}-%d{yyyyMMdd}.logfile>             <append>trueappend>             <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">                 <fileNamePattern>${log.directory}${log.context.name}/${HOSTNAME}.%d{yyyy-MM-dd}.%i.logfileNamePattern>                 <maxHistory>${log.maxHistory}maxHistory>                 <totalSizeCap>30gbtotalSizeCap>                 <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">                   <maxFileSize>2gbmaxFileSize>                 timeBasedFileNamingAndTriggeringPolicy>          rollingPolicy>             <encoder>                 <pattern>${log.pattern}pattern>                 <charset>${log.charset}charset>             encoder>         appender>                    <appender name="ROLLING_FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">             <filter class="ch.qos.logback.classic.filter.LevelFilter">                 <level>${log.error.log.level}level>                 <onMatch>ACCEPTonMatch>                 <onMismatch>DENYonMismatch>             filter>             <file>${log.directory}${log.context.name}/${HOSTNAME}_error-%d{yyyyMMdd}.logfile>                          <append>trueappend>             <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">                 <fileNamePattern>${log.directory}${log.context.name}/${HOSTNAME}_error.%d{yyyy-MM-dd}.logfileNamePattern>                 <maxHistory>${log.maxHistory}maxHistory>             rollingPolicy>                          <encoder>                 <pattern>${log.pattern}pattern>                 <charset>${log.charset}charset>             encoder>         appender>                    <appender name ="ASYNC_FILE" class"ch.qos.logback.classic.AsyncAppender">                          <discardingThreshold >0discardingThreshold>             <queueSize>${log.async.queue.size}queueSize>             <appender-ref ref "ROLLING_FILE_DEFAULT"/>         appender>     springProfile>            <logger name "org.springframework.amqp.rabbit.listener.BlockingQueueConsumer" level ="WARN"/>          <logger name "org.apache.zookeeper.ClientCnxn" level ="WARN"/>          <logger name "com.hualala.commons.multidatasource.curator.CuratorClient" level ="WARN"/>     <logger name "com.hualala.commons.multidatasource.datasource.DynamicDataSource" level ="WARN"/>          <logger name "com.hualala.infrastructure.falcon.FalconMonitor" level ="WARN"/>            <logger name="jdbc.sqltiming" level="debug"/>     <logger name="com.ibatis" level="debug" />     <logger name="com.ibatis.common.jdbc.SimpleDataSource" level="debug" />     <logger name="com.ibatis.common.jdbc.ScriptRunner" level="debug" />     <logger name="com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate" level="debug" />     <logger name="java.sql.Connection" level="debug" />     <logger name="java.sql.Statement" level="debug" />     <logger name="java.sql.PreparedStatement" level="debug" />     <logger name="java.sql.ResultSet" level="debug" />       <logger name="org.springframework" level="WARN" />            <logger name="com.hualala" level="debug" additivity="false">         <springProfile name="local">             <appender-ref ref="STDOUT" />         springProfile>           <springProfile name="mu,dohko,pre">             <appender-ref ref="ASYNC_FILE" />             <appender-ref ref="ROLLING_FILE_ERROR" />         springProfile>           <springProfile name="production">             <appender-ref ref="ASYNC_FILE" />             <appender-ref ref="ROLLING_FILE_ERROR" />         springProfile>     logger>       <root>         <springProfile name="local">             <level value="info"/>             <appender-ref ref="STDOUT" />         springProfile>                    <springProfile name="mu,dohko,pre">             <level value="info"/>               <appender-ref ref="ASYNC_FILE" />             <appender-ref ref="ROLLING_FILE_ERROR" />         springProfile>                    <springProfile name="pre">             <level value="warn"/>               <appender-ref ref="ASYNC_FILE" />             <appender-ref ref="ROLLING_FILE_ERROR" />         springProfile>                    <springProfile name="production">             <level value="info"/>             <appender-ref ref="ASYNC_FILE" />             <appender-ref ref="ROLLING_FILE_ERROR" />         springProfile>     root> configuration>

配置解析

property:将配置中引用的公共的常量做全局设置,便于修改及维护
springProfile:配置spring的环境变量名称(对应application.yml中的profilename,name可以为单个或多个,多个名称用“,”隔开,还可取反,比如!local,代表非local环境的其它所有环境),appender节点的日志级别在未明确指定的情况下,继承自root根结点指定等级及其父等级
root:root根结点配置,内部配置多个环境变量对应的日志引用,为每个环境变量设置对应等级,在local本地环境变量下配置终端输出日志,其它环境则配置写入文件
logger:直接指定第三方服务的根目录报名,设置日志级别高于其默认输出的日志级别,将限制其日志输入;
如果将其日志级别设置为小于等于其日志输出级别,且小于root根节点的日志级别,此时需要输出logger指定日志,则需要配置当前项目的的日志级别为logger中指定的日志级别,

参考资料

github项目配置参考

springboot+logback日志配置

logback官方文档

logback 异步日志配置

相关