动态更改 log4j 日志级别

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

185327 次浏览

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

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

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

更新: 如果您正在使用 Log4j 2,您应该删除每个 文件setLevel的调用,因为这可以通过实现类来实现。

类中不支持对 logger.setLevel ()或类似方法的调用 应用程序应该删除这些 在 Log4j2实现类中提供,但可以保留 应用程序易受 Log4j2内部结构变化的影响。

档案监察员

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

警告: 由于线程泄漏,configureAndWatch 方法不适合在 J2EE 环境中使用

JMX

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

白手起家

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

可以将 Log4j2配置为刷新其配置,方法是按给定的时间间隔扫描 log4j2.xml 文件(或等效文件)。只需将“ 监视器间隔”参数添加到您的配置标记中。参见示例 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>

如果您要部署到 tomcat 实例、 IDE 内部或者使用 Spring 启动时,还有其他步骤可以使其工作。这似乎有点超出了这里的范围,可能值得单独提出一个问题。

对于 log4j 1.x,我发现最好的方法是使用 DOMConfigurator 提交一组预定义的 XML 日志配置(比如,一个用于正常使用,一个用于调试)。

利用这些可以通过这样的方式来实现:

  public static void reconfigurePredefined(String newLoggerConfigName) {
String name = newLoggerConfigName.toLowerCase();
if ("default".equals(name)) {
name = "log4j.xml";
} else {
name = "log4j-" + name + ".xml";
}


if (Log4jReconfigurator.class.getResource("/" + name) != null) {
String logConfigPath = Log4jReconfigurator.class.getResource("/" + name).getPath();
logger.warn("Using log4j configuration: " + logConfigPath);
try (InputStream defaultIs = Log4jReconfigurator.class.getResourceAsStream("/" + name)) {
new DOMConfigurator().doConfigure(defaultIs, LogManager.getLoggerRepository());
} catch (IOException e) {
logger.error("Failed to reconfigure log4j configuration, could not find file " + logConfigPath + " on the classpath", e);
} catch (FactoryConfigurationError e) {
logger.error("Failed to reconfigure log4j configuration, could not load file " + logConfigPath, e);
}
} else {
logger.error("Could not find log4j configuration file " + name + ".xml on classpath");
}
}

只需使用适当的配置名称调用它,并确保将模板放在类路径上。

这个答案不会帮助您动态更改日志记录级别,如果可以重新启动 服务,请使用以下解决方案

我对 Change log4j log 级别执行了这个操作,它对我很有效,我没有引用任何文档。我使用这个系统属性值来设置我的日志文件名。我也使用了相同的技术来设置日志级别,并且它起作用了

将其作为 JVM 参数传递(我使用 Java 1.7)

对不起,这不会动态更改日志记录级别,它需要重新启动服务

java -Dlogging.level=DEBUG -cp xxxxxx.jar  xxxxx.java

在 log4j.properties 文件中,我添加了这个条目

log4j.rootLogger=${logging.level},file,stdout

我尽力了

 java -Dlogging.level=DEBUG -cp xxxxxx.jar  xxxxx.java
java -Dlogging.level=INFO-cp xxxxxx.jar  xxxxx.java
java -Dlogging.level=OFF -cp xxxxxx.jar  xxxxx.java

都成功了,希望这个能帮上忙!

我在 pom.xml 中有以下依赖项

<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>


<dependency>
<groupId>log4j</groupId>
<artifactId>apache-log4j-extras</artifactId>
<version>1.2.17</version>
</dependency>

您可以使用以下代码段

((ch.qos.logback.classic.Logger)LoggerFactory.getLogger(packageName)).setLevel(ch.qos.logback.classic.Level.toLevel(logLevel));

如果要更改所有日志记录器的日志记录级别,请使用以下方法。这将枚举所有日志记录器,并将日志记录级别更改为给定级别。请确保在 log4j.properties文件中设置了 不要log4j.appender.loggerName.Threshold=DEBUG属性。

public static void changeLogLevel(Level level) {
Enumeration<?> loggers = LogManager.getCurrentLoggers();
while(loggers.hasMoreElements()) {
Logger logger = (Logger) loggers.nextElement();
logger.setLevel(level);
}
}

我使用这种方法成功地减少了“ org.apache.http”日志的冗长性:

ch.qos.logback.classic.Logger logger = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger("org.apache.http");
logger.setLevel(Level.TRACE);
logger.setAdditive(false);

对于 log4j2API,可以使用

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