log4j2.properties无法配置导入包使用的slf4j记录器

时间:2018-03-08 13:02:16

标签: java logging log4j slf4j log4j2

我在rootLogger文件内创建log4j2.properties时遇到了一些问题。

正如您从下面的log4j2.properties文件中看到的那样,我已将rootLoggerlevel info定义为rolling,并将其指向RollingFile appender info

但是,当我运行程序时,只有从我的包生成的日志将转到滚动文件appender,并指定了正确的日志级别,在这种情况下为org.apache.kafka.clients.consumer.KafkaConsumer

但是从我导入的打包生成的日志(我的依赖项,例如info)不会写入滚动文件。相反,它打印在控制台上,并且没有指定的级别rootLogger,因为甚至打印出DEBUG日志。看起来我指定的log4j2.properties从未创建且有效。

在某种程度上,为什么rootLogger不工作? ;换句话说,我如何控制从导入的包中生成的日志?

BTW,我这样使用java -Dlog4j.configurationFile=/path/to/my/log4j2.properties [options] xxx

status = info
name = PropertiesConfig

property.directory = logs
property.filename = kafka.log

appenders = console, rolling

appender.console.type = Console
appender.console.name = STDOUT
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = [%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n

appender.rolling.type = RollingFile
appender.rolling.name = RollingFile
appender.rolling.fileName = ${directory}${sys:file.separator}${filename}
appender.rolling.filePattern = ${directory}${sys:file.separator}kafka-%d{yyyy-MM-dd-HH-mm-ss}-%i.log.gz
appender.rolling.layout.type = PatternLayout
appender.rolling.layout.pattern = [%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n
appender.rolling.policies.type = Policies
#appender.rolling.policies.time.type = TimeBasedTriggeringPolicy
#appender.rolling.policies.time.interval = 2
#appender.rolling.policies.time.modulate = true
appender.rolling.policies.size.type = SizeBasedTriggeringPolicy
appender.rolling.policies.size.size = 50MB

loggers = rolling

logger.rolling.name = kafka
logger.rolling.level = info
logger.rolling.additivity = false
logger.rolling.appenderRefs = rolling
logger.rolling.appenderRef.rolling.ref = RollingFile

rootLogger.level = info
rootLogger.additivity = false
rootLogger.appenderRefs = rolling
rootLogger.appenderRef.rolling.ref = RollingFile

log4j2.properties:

org.apache.logging.log4j.Logger

更新1

我找到了问题,但寻找解决方案。

问题是:我使用的是org.slf4j.Logger,但我导入的软件包正在使用log4f2.properties。这就是我的log4j-slf4j-impl无法从导入的包中控制记录器的原因(例如,kafka-clients)。

然后,我的问题是:我该如何解决这个问题?

更新2

我尝试将pom.xml导入log4j-slf4j-impl,将其导入我的项目中。它不起作用。

更新3

导入SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:xxx1] SLF4J: Found binding in [jar:file:xxx2] SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation. 后,我看到了这一点:

logback

然后,我回顾所有依赖项及其依赖项,发现其中一个依赖于log4j-slf4j-impl,并且此logback包含logger binder,这与{{1}中的绑定器复杂化}。

所以我在pom中的这个依赖项中添加了以下内容:

<dependencies>
    <dependency>
        <groupId>aaa</groupId>
        <artifactId>bbb</artifactId>
        <version>2.0.0</version>
        <exclusions>
            <exclusion>
                <groupId>ch.qos.logback</groupId>
                <artifactId>logback-classic</artifactId>
            </exclusion>
            <exclusion>
                <groupId>ch.qos.logback</groupId>
                <artifactId>logback-core</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    ...
</dependencies>

轰!问题解决了! slf4j的记录器正在使用我给的log4j2.properties

1 个答案:

答案 0 :(得分:0)

我自己解决了这个问题。请参阅问题部分的更新1,2,3。