动态更改log4j日志级别

问题

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


#1 热门回答(79 赞)

#File Watchdog

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()方法。你是否将设置保留在某处取决于你自己。


#2 热门回答(71 赞)

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

LogManager.getRootLogger().setLevel(Level.DEBUG);

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

**更新:**如果你使用的是Log4j 2,则应该删除对电话号码为setLeveldocumentation,这可以通过实现类来实现。

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


#3 热门回答(3 赞)

可以将Log4j2配置为通过以给定间隔扫描log4j2.xml文件(或等效文件)来刷新其配置。只需将"monitorInterval"参数添加到配置标记即可。请参阅示例log4j2.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>