当前位置: 首页 > 知识库问答 >
问题:

Log4j2-LogManager。getLogger(“名称”)未找到自定义记录器

公良浩邈
2023-03-14

Log4j2-LogManager。getLogger(“名称”)未找到自定义记录器。

以下所有操作都返回相同的记录器,即此代码所在类的根记录器。我想这些都会有所不同,我会在前3个电话中拿回我的3个定制电话。注意:将创建appender指定的文件,但不会向其发送日志。

Logger _l = (Logger) LogManager.getLogger("Global");
       _l = (Logger) LogManager.getLogger("fakeswitch");
       _l = (Logger) LogManager.getLogger("fakeswitch_two");
       _l = (Logger) LogManager.getLogger();

我使用以下方法创建自定义记录器:

ComponentBuilder triggeringPolicy = configurationBuilder.newComponent("Policies")
        .addComponent(configurationBuilder.newComponent("TimeBasedTriggeringPolicy").
                addAttribute("interval", "1"));

AppenderComponentBuilder log4jFileAppenderBuilder = configurationBuilder.
        newAppender(pName + "_SmdrDailyRollingFileAppender", "RollingFile");
log4jFileAppenderBuilder.addAttribute("filename", pLogFilename);
log4jFileAppenderBuilder.addAttribute("filePattern", pLogFilenamePattern);
log4jFileAppenderBuilder.addComponent(triggeringPolicy);

// Configure the PatternLayout
LayoutComponentBuilder layoutComponentBuilder = configurationBuilder.newLayout("PatternLayout").
        addAttribute("pattern", DEBUG_PATTERN_LAYOUT_STRING);
log4jFileAppenderBuilder.add(layoutComponentBuilder);

// Add it back into configuration
configurationBuilder.add(log4jFileAppenderBuilder);

// https://logging.apache.org/log4j/2.x/manual/customconfig.html
LoggerComponentBuilder logger = configurationBuilder.newLogger(pName, Level.DEBUG);
logger.add(configurationBuilder.newAppenderRef(pName + "_SmdrDailyRollingFileAppender"));
logger.addAttribute("additivity", false);
configurationBuilder.add(logger);

// Actually use it
LoggerContext _loggerContext = Configurator.initialize(configurationBuilder.build());

writeXmlConfiguration中的等效XML为:

<?xml version="1.0" ?>
<Configuration>
    <Appenders>
        <RollingFile name="Global_SmdrDailyRollingFileAppender" filename="ps/debug/SMDR_DEBUG.txt"
                     filePattern="ps/debug/SMDR_DEBUG_%d{yyyyMMdd}.txt.gz">
            <Policies>
                <TimeBasedTriggeringPolicy interval="1"/>
            </Policies>
            <PatternLayout pattern="%d{MM.DD.yy-HH:mm:ss} %m%n"/>
        </RollingFile>
        <RollingFile name="fakeswitch_SmdrDailyRollingFileAppender" filename="ps/debug/SMDR_DEBUG_fakeswitch.txt"
                     filePattern="ps/debug/SMDR_DEBUG_fakeswitch_%d{yyyyMMdd}.txt.gz">
            <Policies>
                <TimeBasedTriggeringPolicy interval="1"/>
            </Policies>
            <PatternLayout pattern="%d{MM.DD.yy-HH:mm:ss} %m%n"/>
        </RollingFile>
        <RollingFile name="fakeswitch_two_SmdrDailyRollingFileAppender"
                     filename="ps/debug/SMDR_DEBUG_fakeswitch_two.txt"
                     filePattern="ps/debug/SMDR_DEBUG_fakeswitch_two_%d{yyyyMMdd}.txt.gz">
            <Policies>
                <TimeBasedTriggeringPolicy interval="1"/>
            </Policies>
            <PatternLayout pattern="%d{MM.DD.yy-HH:mm:ss} %m%n"/>
        </RollingFile>
    </Appenders>
    <Loggers>
        <Logger name="Global" level="DEBUG" additivity="false">
            <AppenderRef ref="Global_SmdrDailyRollingFileAppender"/>
        </Logger>
        <Logger name="fakeswitch" level="DEBUG" additivity="false">
            <AppenderRef ref="fakeswitch_SmdrDailyRollingFileAppender"/>
        </Logger>
        <Logger name="fakeswitch_two" level="DEBUG" additivity="false">
            <AppenderRef ref="fakeswitch_two_SmdrDailyRollingFileAppender"/>
        </Logger>
    </Loggers>
</Configuration>

共有1个答案

唐修能
2023-03-14

彼得卡瓦兹为我回答了这个问题。

只有当LoggerContext尚未初始化时,这才有效。由于每次调用LogManager方法都会初始化LoggerContext,因此使用Configurator几乎肯定为时已晚。初始化。

使用配置。改为重新配置,这在所有情况下都有效。

彼得

---我的代码更改是

LoggerContext _loggerContext = Configurator.initialize(configurationBuilder.build());

Configurator.reconfigure(configurationBuilder.build());
 类似资料:
  • 我正在使用log4j在我的一个应用程序上做一些日志记录。我的配置文件中的日志记录程序如下所示。 基本上,我希望从我写的代码中获得“信息”级别的消息,但是我希望外部库只在有警告或更可怕的情况下记录。 这正如我所期望的那样工作,但是在“org.eclipse.jetty”下有很多类 有可能这样做吗? 也就是说,我希望整个包中的所有内容都只警告/错误/致命。 我试了上述方法,但没有效果。是否有一个“通配

  • 问题内容: 为什么这样的结构 给一个错误? 问题答案: 默认参数值在函数定义时评估,但仅在函数调用时可用。因此,参数列表中的参数不能相互引用。 将参数默认为默认值并在代码中为此添加测试是一种常见的模式:

  • 我有麻烦配置我的log4j2.xml文件包括Hibernate日志记录。 这是我的xml文件: 在启动我的罐子时,我会将以下内容打印到控制台: 我似乎从我的应用程序中获取日志到我的滚动文件中,但我不明白为什么这个hibernate记录器没有使用相同的appender。 非常感谢您的帮助!

  • 我正在尝试为log4j2.0创建一个自定义appender,但是在获取log4j配置以识别appender时遇到问题。我知道log4j 2.0不支持配置属性中的包。因此,正如这里所建议的,我尝试使用纯javac运行代码,但即使如此,它也会出现以下错误: 这是我的自定义附件: 和我的配置xml: 提前感谢您提供的有用信息

  • 我定义了多个记录器,如下所示(com.xyz和org.xyz)。Log4j2忽略了第一个记录器定义,只加载第二个。在示例中,org.xyz未加载。 在log4j2调试消息下方查找。 我的配置正确吗?