背景:SpringBoot项目整合Druid,日志框架准备从log4j换到logback,项目启动过程中出现如下报错:
`log4j:WARN No appenders could be found for logger (com.alibaba.druid.pool.DruidDataSource).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.`
尽管说表面上没有影响项目运行,但是只要启动项目就会看到这红红的报错(其他原因后面再说)。
说是未发现logger
,因为项目中配置了Druid
的Filter
,Filter
需要配置logger
,之前的log4j
配置文件被我删掉了,我新建的日志配置文件:logback-spring.xml
。
可能发生这种情况的另一个原因是您在目标文件中使用多个日志记录框架。例如,如果在目标文件内容选项卡中使用slf4j,log4j和ch.qos.logback.slf4j的组合,则会发生这种情况。
之前Druid
的配置是:
dataSourceA.filters=stat,wall,log4j
项目中配置了多数据源,以A,B,C区分,其他信息分别是:监控统计用的filter:stat
日志用的filter:log4j
防御sql注入的filter:wall
现在我把需要把日志框架换成logback
,应该怎么配置呢log4j
换成logback还是别的?去github上的Druid找一找,果然找到结果,Druid
支持配置多种Filter,配置信息保存在druid-xxx.jar!/META-INF/druid-filter.properties
下面,具体如下:
druid.filters.default=com.alibaba.druid.filter.stat.StatFilter
druid.filters.stat=com.alibaba.druid.filter.stat.StatFilter
druid.filters.mergeStat=com.alibaba.druid.filter.stat.MergeStatFilter
druid.filters.counter=com.alibaba.druid.filter.stat.StatFilter
druid.filters.encoding=com.alibaba.druid.filter.encoding.EncodingConvertFilter
druid.filters.log4j=com.alibaba.druid.filter.logging.Log4jFilter
druid.filters.slf4j=com.alibaba.druid.filter.logging.Slf4jLogFilter
druid.filters.commonlogging=com.alibaba.druid.filter.logging.CommonsLogFilter
druid.filters.commonLogging=com.alibaba.druid.filter.logging.CommonsLogFilter
druid.filters.wall=com.alibaba.druid.wall.WallFilter
druid.filters.config=com.alibaba.druid.filter.config.ConfigFilter
众所周知,logback
是slf4j
的实现类,按照规定格式,改成下面就可以了:
dataSourceA.filters=stat,wall,slf4j
然后启动,完成!
如果还是启动失败,看看自己是不是还包另外一个错,是不是还报了
SLF4J: Class path contains multiple SLF4J bindings.
这个错,说你存在多个SLF4J
绑定,如果有的话请先把这个错误搞定,具体可以参考:slf4j绑定错误
注意: 如果还是报错请去掉log4j的依赖
补充:Druid的Filter属性类型是字符串,通过别名的方式配置扩展插件,上面都可以配置,格式可以写成这种:
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
... ...
<property name="filters" value="stat,log4j" />
</bean>