springboot+logback日志规范
当前问题
项目采用springboot的框架集成了logback的日志配置方式,但是在使用中遇到了很多问题,同时也基于“立刻方能用好”的原则,对于logback与springboot的配置做了一些了解和其它项目的配置对比,结合当前项目的需求,及需要解决的问题的方案,记录于此。
- logback的日志配置统一采用/home/logs目录,但是基于本地测试时,Mac电脑没有权限写文件到/home目录,同时也不想写日志文件到本机
- 本地调试项目,需要将日志输出到终端查看接口执行流程,但是其它环境不能将日志输出到终端,频繁更改配置容易上线时疏漏
- 线上日志输出需要采用info级别,但是其他环境(dohko,pre)可能需要做debug输出,获取更多的日志信息,频繁更改日志级别容易导致上线时疏忽检查导致线上日志文件很大
- mybatis的sql输出只有在debug模式下才能输出,但是线上日志都是info级别,如何做到info级别的日志也能输出mybatis的sql日志
- 同一日志级别下,需要过滤项目依赖其它包的日志输出,或将其日志级别调低,甚至不输出
配置示例
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%n pattern >
< 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}.log file >
< append >true append >
< rollingPolicy class = "ch.qos.logback.core.rolling.TimeBasedRollingPolicy" >
< fileNamePattern >${log.directory}${log.context.name}/${HOSTNAME}.%d{yyyy-MM-dd}.%i.log fileNamePattern >
< maxHistory >${log.maxHistory} maxHistory >
< totalSizeCap >30gb totalSizeCap >
< timeBasedFileNamingAndTriggeringPolicy class = "ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP" >
< maxFileSize >2gb maxFileSize >
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 >ACCEPT onMatch >
< onMismatch >DENY onMismatch >
filter >
< file >${log.directory}${log.context.name}/${HOSTNAME}_error-%d{yyyyMMdd}.log file >
< append >true append >
< rollingPolicy class = "ch.qos.logback.core.rolling.TimeBasedRollingPolicy" >
< fileNamePattern >${log.directory}${log.context.name}/${HOSTNAME}_error.%d{yyyy-MM-dd}.log fileNamePattern >
< 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 >0 discardingThreshold >
< 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 异步日志配置