log4j2 未找到 1 个记录器的附加程序

Posted

技术标签:

【中文标题】log4j2 未找到 1 个记录器的附加程序【英文标题】:log4j2 No appenders found for 1 logger 【发布时间】:2017-05-09 23:55:35 【问题描述】:

我在配置我的 log4j2.xml 文件以包含休眠日志时遇到问题。

这是我的 xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="TRACE">
    <Properties>
        <Property name="logDir" value="$env:MY_APP/logs"/>
    </Properties>
    <Appenders>
        <RollingFile name="MY_APP" fileName="$logDir/my_app.log" bufferedIO="true" filePattern="$logDir/my_app-%dyyyy-MM-dd-%i.log.gz">
            <PatternLayout pattern="[%t] %d %-5p %x %m%n"/>
            <Policies>
                <OnStartupTriggeringPolicy/>
                <TimeBasedTriggeringPolicy/>
            </Policies>
            <DefaultRolloverStrategy>
                <Delete basePath="$logDir" maxDepth="1">
                    <IfFileName glob="my_app-*.log.gz" />
                    <IfLastModified age="31d" />
                </Delete>
            </DefaultRolloverStrategy>
         </RollingFile>
     </Appenders>
     <Loggers>
         <Root level="trace">
             <AppenderRef ref="MY_APP" level="debug"/>
         </Root>
         <Logger name="com.company" level="info"/>
         <Logger name="com.companyName" level="info"/>
         <Logger name="com.companyName.myApp" level="debug"/>
         <Logger name="org.hibernate" level="info"/>
    </Loggers>

在我的 jar 启动时,我会在控制台上打印以下内容:

log4j:WARN No appenders could be found for logger(org.hibernate.type.BasicTypeRegistry).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

我似乎从我的应用程序中获取日志到我的 RollingFile 中,但我不明白为什么这个休眠记录器没有使用相同的附加程序。

非常感谢任何帮助!

【问题讨论】:

为了澄清你想让hibernate附加到同一个文件? @Ishnark 正确,我希望它们都附加到同一个文件中 我认为您必须专门告诉休眠记录器以记录到文件。 &lt;logger name="org.hibernate" level="info"&gt;&lt;appender-ref ref="MY_APP"/&gt;&lt;/logger&gt; @Ishnark 很抱歉回复晚了,嗯,这似乎也不起作用,同样的警告信息 【参考方案1】:

我遇到了类似的问题,但我的问题与我创建的特定类有关,而不是在库中。但是,我发现该错误专门针对 log4j2 是因为我使用了不正确的 Logger。

我的代码曾经是:

import org.apache.log4j.Logger;

public class SomeClass 
   static Logger logger = Logger.getLogger(SomeClass.class);

最终对我有用的是:

import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;

public class SomeClass 
   static Logger logger = LogManager.getLogger(SomeClass.class.getName());

注意:导入的差异以及“创建”记录器的方式。

这就是为我解决这个确切错误的方法,但它不在库中。

对我来说,我的项目中也有 Hibernate,但没有任何额外的配置,Hibernate 会自动将日志记录到我的所有附加程序中。他们可能已经在更新包中修复了这个问题。

SUGGESTION(如果尚未修复)-也许尝试升级 Hibernate 的包/库,看看它是否有效。或者,看看你是否可以找出记录器是如何创建的,以便使用它使用org.apache.logging.log4j.Logger INSTEAD of org.apache.log4j.Logger

【讨论】:

【参考方案2】:

其实控制台显示的事实

log4j:WARN No appenders could be found for logger(org.hibernate.type.BasicTypeRegistry).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

表示 log4j 1.x jar 仍然存在于类路径中,并且没有提供 log4j 1.x 配置。解决此问题的方法是将 log4j 1.x jar 替换为 Log4j 2 中的 log4j-1.2-api jar。

【讨论】:

以上是关于log4j2 未找到 1 个记录器的附加程序的主要内容,如果未能解决你的问题,请参考以下文章

在 Spring Boot 应用程序中未针对休眠和弹簧过滤 Log4j2 日志级别

Django 1.3 日志记录:未记录 500 个错误

log4j2 - Syslog 附加程序和 PatternLayout

休眠(4.3.11-Final)日志记录未桥接到 log4j2?

使用 slf4j 绑定自定义 log4j2 包装器

log4j2:运行时重新配置记录器的问题