代码之家  ›  专栏  ›  技术社区  ›  fluency03

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

  •  1
  • fluency03  · 技术社区  · 8 年前

    我在创建 rootLogger 在…内 log4j2.properties 文件

    正如你从我的 log4j2.properties 在下面的文件中,我定义了 根记录器 具有 level 属于 info ,并将其指向 rolling 追加器 RollingFile

    但是,当我运行程序时,只有从包中生成的日志才会进入滚动文件附加器,并指定了正确的日志级别,即 信息 在这种情况下。

    但是从我导入的打包文件生成的日志(例如,我的依赖项, org.apache.kafka.clients.consumer.KafkaConsumer )未写入滚动文件。相反,它打印在控制台上,并且不具有指定的级别 信息 ,因为即使是调试日志也会打印出来。看起来像 根记录器 我指定的是永远不会创建和有效的。

    一方面,rootLogger为什么不工作;另一方面,如何控制从导入包生成的日志?

    顺便说一句,我正在使用 log4j2.properties 以这种方式:

    java -Dlog4j.configurationFile=/path/to/my/log4j2.properties [options] xxx
    

    log4j2.属性:

    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
    

    更新1

    我发现了问题,但正在寻找解决方案。

    问题是:我正在使用 org.apache.logging.log4j.Logger 但是我导入的包正在使用 org.slf4j.Logger 。这就是为什么我 log4f2.properties 无法从导入的包控制记录器(例如, kafka-clients )。

    那么,我的问题是:我如何解决这个问题?

    更新2

    我已尝试导入 log4j-slf4j-impl 把它放进我的项目中 pom.xml 。它不起作用。

    更新3

    我导入后 log4j-slf4j-impl ,我看到了:

    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 ,此logback包含it logger活页夹,这使中的活页夹更加复杂 log4j-slf4j-impl

    因此,我在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 回复  |  直到 8 年前
        1
  •  0
  •   fluency03    8 年前

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