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

Log4j2在运行时不更改日志记录级别

程钧
2023-03-14

是的,我已经阅读了所有相关的问题。我正在使用log4j2(尝试了2.4版和更新到最新的2.6.2版)。

我有一个面向客户的小型实用程序。我渴望将暴露的配置保持在最低限度。但对于有问题的情况,我还想添加一个-debug标志,以便在运行时启用调试日志。

这是我启用调试日志记录的代码

private static void enableDebugLogs(){
    LoggerContext ctx = (LoggerContext) LogManager.getContext();
    LoggerConfig log = ctx.getConfiguration().getRootLogger();

    System.out.println(log.getLevel()); // INFO

    log.setLevel(Level.DEBUG);

    System.out.println(log.getLevel()); // DEBUG

    ctx.updateLoggers();

    System.out.println(ctx.getRootLogger().getLevel()); // DEBUG, hey it works, right?
}

但它实际上并不适用于这些情况:

enableDebugLogs();
logger.debug("Debug mode on"); // static, already made logger. Level did not change

LogManager.getLogger(Main.class).debug("Debug"); // Nope, not printing

Logger root = LogManager.getRootLogger();
root.info("Level: " + root.getLevel());  // Level: INFO, should be DEBUG

实用程序通常在30秒内完成,因此更改应该是即时的。这是log4j2。xml

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level - %msg%n"/>
        </Console>
        <RollingFile name="File" fileName="program_name.log" filePattern="program_name-archived.log">
            <PatternLayout>
                <Pattern>%d{HH:mm:ss.SSS} %-5level - %msg%n</Pattern>
            </PatternLayout>
            <Policies>
                <SizeBasedTriggeringPolicy size="10 KB" />
            </Policies>
            <DefaultRolloverStrategy min="1" max="1"/>
        </RollingFile>
    </Appenders>
    <Loggers>
        <Root level="info">
            <AppenderRef ref="Console"/>
            <AppenderRef ref="File"/>
        </Root>
    </Loggers>
</Configuration>

使用AppenderRefs的问题是什么?我可以以某种方式告诉应用程序从根记录器更新日志级别吗?

共有3个答案

晋涛
2023-03-14

要在log4j2初始化后重新配置它,文档提供了两种方法:

  1. 使用配置文件,您可以启用自动重新配置(这是首选方式),以便在初始化后修改文件将反映在运行时:http://logging.apache.org/log4j/2.x/manual/configuration.html#AutomaticReconfiguration
  2. 使用ConfigurationBuilder,您可以通过编程方式重新配置log4j(我认为这正是您需要的),请参阅本页的“使用ConfigurationBuilder和Configurator重新配置log4j”一段:http://logging.apache.org/log4j/2.x/manual/customconfig.html
乐正明辉
2023-03-14

您可以在两个或多个log4j2之间更改日志记录配置。xml文件
例如,创建两个log4j2。具有不同配置的xml文件。log4j2。xml

ConfigurationFactory configFactory = XmlConfigurationFactory.getInstance();
            ConfigurationFactory.setConfigurationFactory(configFactory);
            LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
            ClassLoader classloader = Thread.currentThread().getContextClassLoader();
            InputStream inputStream = classloader.getResourceAsStream(logFileName);
            ConfigurationSource configurationSource = new ConfigurationSource(inputStream);

            ctx.start(configFactory.getConfiguration(ctx, configurationSource));
舒阳州
2023-03-14

找到了真正的问题。不得不使用:

LoggerContext ctx = (LoggerContext) LogManager.getContext(false);

而不是

LoggerContext ctx = (LoggerContext) LogManager.getContext();

API声明差异为“返回LoggerContext”和“返回当前LoggerContext”。对于没有布尔参数的版本,我显然错过了一些信息:

“警告-此方法返回的LoggerContext可能不是用于为调用类创建记录器的LoggerContext。”

 类似资料:
  • 我目前正在尝试降低我在java项目中使用的PDFBox 1.8.6库的日志记录级别,但失败了。基于前面的问题,我在 /src/目录中有以下log4j.properties文件。 我不确定我还遗漏了什么,因为我仍然在控制台中收到类似以下消息的垃圾邮件。 如果有一种方法可以通过编程方式更改日志级别,那么我根本不会附加到属性文件,因为我在其他任何地方都不使用log4j。我不知道它是否使用log4j。属性

  • IBM WAS8允许通过API在运行时更改日志级别。如何在不改变server.xml的情况下对IBM Liberty server做同样的事情?我认为这是可能的,通过定义自定义API,例如RESTendpoint将做到这一点。供应商推荐这样做吗?

  • 互联网上有许多帖子建议如何从logback迁移到log4j2进行Spring引导日志记录。 参考这个sof post-Spring Boot日志与log4j2-我已经配置我的项目使用log4j2。然后我添加了一些基本的log4j2.xml和log4j2.properties文件来测试。 但是在这些更改之后,我的项目无法进行任何日志记录。有人能帮我找出毛病吗? 项目代码可在github-https:

  • 我有一个用例,在这个用例中,我运行了数千个SQL查询和日志记录集,按照现在的情况,将每个查询写到控制台需要花费大量时间,并且会使客户端的调用超时。我试着将pom.xml中dev概要文件的logback.loglevel属性设置为ERROR,但是没有用。 所以我的问题是: < li >是否可以为单独的REST调用配置日志级别? < li >如何全局配置应用程序的日志级别?

  • 我试图从log4j1更改为log4j2。我所做的: 已删除旧配置文件log4j。xml 创建了新的配置文件log4j2。xml 创建了jboss部署结构。xml 编辑的pom 环境:野蝇10 1 EAR 4 WAR文件中没有使用web.xml。以前的log4j配置日志在EAR中(仅) Log4j2配置文件 Jboss部署结构 新的maven依赖关系 我之前说过我在SLF4j中使用log4j1。这些

  • 问题内容: 我在系统中收到以下消息:“ FacesMessage已入队…。 ”。 Sun的JavaServer Faces实现(1.2_07-b03-FCS)的解决方案是将其添加到web.xml: 但是出于某种原因,该解决方案不适用于我正在使用 Mojarra(1.2_15-b01-FCS)的 该实施 。 该文档说,我只需要简单地更改RenderResponsePhase的记录器即可。 Faces