动态更改log4j日志级别

Rav*_*avi 120 java logging log4j runtime

有哪些动态更改log4j日志级别的方法,以便我不必重新部署应用程序.在这些情况下,这些变化是永久性的吗?

mha*_*ler 86

文件看门狗

Log4j能够查看log4j.xml文件以进行配置更改.如果更改log4j文件,log4j将根据您的更改自动刷新日志级别.有关org.apache.log4j.xml.DOMConfigurator.configureAndWatch(String,long详细信息,请参阅文档).检查之间的默认等待时间为60秒.由于您直接更改文件系统上的配置文件,因此这些更改将是持久的.您需要做的就是调用DOMConfigurator.configureAndWatch()一次.

警告:由于Thread泄漏,configureAndWatch方法在J2EE环境中使用是不安全的

JMX

设置日志级别(或通常重新配置)log4j的另一种方法是使用JMX.Log4j将其记录器注册为JMX MBean.使用应用程序服务器MBeanServer控制台(或JDK的jconsole.exe),您可以重新配置每个单独的记录器.这些更改不是持久性的,并且会在重新启动应用程序(服务器)后重置为配置文件中设置的配置.

自制

如Aaron所述,您可以以编程方式设置日志级别.您可以按照自己希望的方式在应用程序中实现它.例如,您可以使用GUI,其中用户或管理员更改日志级别,然后调用setLevel()记录器上的方法.您是否将设置保留在某处取决于您自己.

  • 关于log4j看门狗方法的一个警告:"因为configureAndWatch启动了一个单独的监视程序线程,并且由于无法在log4j 1.2中停止此线程,所以configureAndWatch方法对于在应用程序被回收的J2EE环境中使用是不安全的".参考:[Log4J FAQ](http://logging.apache.org/log4j/1.2/faq.html#a3.6) (8认同)
  • “正如亚伦所描述的那样”——亚伦是谁,所描述的是什么?这个答案需要说明是否有一种编程方式可以做到这一点,答案似乎是否定的。请这么说,因为这是您期望存在的,并且显然没有这样的解决方案。 (2认同)

Aar*_*ver 81

更改日志级别很简单; 修改配置的其他部分将提供更深入的方法.

LogManager.getRootLogger().setLevel(Level.DEBUG);
Run Code Online (Sandbox Code Playgroud)

这些变化是通过生命周期的永久性变化Logger.在重新初始化时,将读取并使用配置,因为在运行时设置级别不会保持级别更改.

更新:如果您使用的是Log4j 2,则应删除setLevel文档的调用,因为这可以通过实现类来实现.

API不支持调用logger.setLevel()或类似方法.应用程序应删除这些.Log4j 2实现类中提供了等效功能,但可能使应用程序容易受到Log4j 2内部更改的影响.

  • 请注意,log4j 2 API不提供"setLevel"方法. (8认同)
  • @ChrisCantrell Log4j 2 [确实提供了一种方法](http://stackoverflow.com/questions/23434252/programmatically-change-log-level-in-log4j2),虽然它并不那么简单. (8认同)
  • 仅适用于运行时依赖项`LogManager.getLogger(Class.forName("org.hibernate.util.JDBCExceptionReporter")).setLevel(Level.FATAL);` (5认同)
  • 但是这只设置了根记录器,不是吗?如果为root下的记录器设置了单独的级别,则设置根记录器对这些LOGGER没有影响.我们不是必须做root.getLoggerRepository().getCurrentCategories()这样的事情,迭代记录器的每个实例并为每个记录器设置LEVEL?@AaronMcIver (5认同)
  • 可以将Log4j2配置为通过以给定间隔扫描log4j2.xml文件(或等效文件)来刷新其配置.例如<Configuration status ="warn"monitorInterval ="5"name ="tryItApp"packages =""> (2认同)
  • 这个答案应该被拒绝,更改,删除或其他。这只会引起混乱,因为它没有记录如何为log4j2解决它。 (2认同)

moh*_*ane 6

对于 log4j 2 API ,您可以使用

Logger logger = LogManager.getRootLogger();
Configurator.setAllLevels(logger.getName(), Level.getLevel(level));

Run Code Online (Sandbox Code Playgroud)


Kim*_*son 5

可以将Log4j2配置为通过以给定间隔扫描log4j 2 .xml文件(或等效文件)来刷新其配置.只需将" monitorInterval "参数添加到配置标记即可.请参阅示例log4j 2 .xml文件的第2行,该文件告诉log4j在上次日志事件超过5秒后重新扫描其配置.

<?xml version="1.0" encoding="UTF-8" ?>
<Configuration status="warn" monitorInterval="5" name="tryItApp" packages="">

    <Appenders>
        <RollingFile name="MY_TRY_IT"
                     fileName="/var/log/tryIt.log"
                     filePattern="/var/log/tryIt-%i.log.gz">
            <Policies>
                <SizeBasedTriggeringPolicy size="25 MB"/>
            </Policies>
            ...
        </RollingFile>
    </Appenders>


    <Loggers>
        <Root level="error">
            <AppenderRef ref="MY_TRY_IT"/>
        </Root>
    </Loggers>

</Configuration>
Run Code Online (Sandbox Code Playgroud)

如果要部署到tomcat实例,IDE内部或使用spring boot,还有其他步骤可以使其工作.这似乎有点超出范围,可能有一个单独的问题.