关于springboot日志配置的文章挺多的在此不做赘述,可参考博客:
http://tengj.top/2017/04/05/springboot7/
这里我要说的是关于日志打印等级过滤、sql打印的问题:
简单的日志过滤肯定是比较简单的,基于spring,将所有的日志等级过滤、通过同意的配置文件,将本地、测试、生产环境区别开,包括sql的打印。
1. 首先是sql打印的问题,在mybatis中配置logImpl属性
<setting name="logImpl" value="XXXX" />
这个属性的值mybatis的已经说明的比较清楚,不知道的可以到mybatis的官网去查看mybatis.xml的配置说明,这个选项给出了如下值:SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING,其中没有对logging支持;比较特殊的一个是STDOUT_LOGGING,如果配置它,会发现控制台除了自己可以控制的log日志之外还会有完整的sql打印出来,原因是属性logImpl=STDOUT_LOGGING时,mybatis在初始化的时候会走一个方法:isDebugEnabled(){return true;}
我们可以发现,在mybatis底层封装的sql打印是通过system.out.println()来打印的。
如果logImpl=STDOUT_LOGGING,sql打印不受log过滤,日志显得比较庞大,测试和生产环境都将打印所有的执行sql及其细节,显然这不是好的选择,当然如果是自己的本地可以通过更改logging-config.xml来实现打印所有sql,因为mybatis原生打印出来的sql美观度、可读性是最好的。这里可以根据自己引入的log工具来设置logImpl的值,此时想要看到控制台打印sql详情就需要在配置文件里面设置:level: debug
logging: config: classpath:config/xxxx-config.xml path: xxx/xxx/xxx level: error match: ACCEPT #ACCEPT/DENY mismatch: ACCEPT这样便可以同样打印出所有执行过的sql,可读性稍差,如果sql报错,log和mybatis底层都会将sql的错误详情打印出来。
2. 其次是日志过滤配置化
<springProperty scope="context" name="LOG_HOME" source="logging.path"/> <springProperty scope="context" name="LOG_LEVEL" source="logging.level"/> <springProperty scope="context" name="LOG_ONMATCH" source="logging.match"/> <springProperty scope="context" name="LOG_ONMISMATCH" source="logging.mismatch"/>
需要注意的是,从application.yml中引用属性的时候,必须使用springProperty标签,不然程序会报错,这个标签表示等待spring的配置文件读取后才能加载这里的属性
<!-- 按照每天生成日志文件 --> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>${LOG_LEVEL}</level> <onMatch>${LOG_ONMATCH}</onMatch> <onMismatch>${LOG_ONMISMATCH}</onMismatch> </filter> <Prudent>true</Prudent> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <FileNamePattern>${LOG_HOME}/claim-%d{yyyy-MM-dd}.log</FileNamePattern> <MaxHistory>30</MaxHistory> </rollingPolicy> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> </encoder> <!--日志文件最大的大小--> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <MaxFileSize>10MB</MaxFileSize> </triggeringPolicy> </appender>
这里需要注意的是,日志文件的大小限制和每天生成一份日志在这里会有冲突,有了大小限制便无法自动切换到第二点的日志,反复尝试确认是有冲突,这里我认为是存在一个bug,做的不太好
<!-- log输出等级 --> <root level="${LOG_LEVEL}"> <appender-ref ref="CONSOLE" /> <appender-ref ref="FILE" /> </root>
最后,再次控制控制台和文件中的日志过滤等级。
3. 最后要说的是springboot2.0和1.5版本之间的区别,springboot2.0比1.5扩充了许多东西,许多模块基于架构做出了调整,比如:
server: port: 8084 servlet: context-path: /
原来的context-path是直接跟在server下面的,现在server下面划出servlet层,将context-path放到了servlet下面,logging也发生了改动,但是存在一个bug,如果你是一个springboot1.5的版本改成了2.0,诸如context-path的改动是会直接报错的,但是logging的level属性却没有,还存在原来的方法,但是运行项目的时候会报错:
Failed to bind properties under 'logging.level' to java.util.Map<java.lang.String, java.lang.String>
即使是新建的2.0的项目,按照原来的写法可以通过快捷键键出level属性但是运行会报错......
logging: config: classpath:config/logback-config.xml pattern: level: error此时应该如此设置。