有哪些不同的方法可以动态地更改log4j日志级别,这样我就不必重新部署应用程序了。在这些情况下,这些更改是永久性的吗?
thigvfpy1#
更改日志级别很简单;修改配置的其它部分将提出更深入的方法。
LogManager.getRootLogger().setLevel(Level.DEBUG);
这些更改在Logger的整个生命周期内都是永久性的。重新初始化时,将读取配置并将其用作运行时设置级别,而不会保留级别更改。
Logger
**UPDATE:**如果您使用Log4j 2,则应根据documentation删除对setLevel的调用,因为这可以通过实现类实现。
setLevel
API中不支持对logger.setLevel()或类似方法的调用。应用程序应删除这些方法。Log4j 2实现类中提供了等效的功能,但可能会使应用程序容易受到Log4j 2内部更改的影响。
pvabu6sv2#
Log4j能够监视log4j.xml文件的配置更改。如果更改log4j文件,log4j将根据您的更改自动刷新日志级别。有关详细信息,请参阅org.apache.log4j.xml.DOMConfigurator.configureAndWatch(String,long的文档。检查之间的默认等待时间为60秒。这些更改将是永久性的。因为您直接更改了文件系统上的配置文件。您所需要做的就是调用DOMConfigurator.configureAndWatch()一次。
log4j.xml
org.apache.log4j.xml.DOMConfigurator.configureAndWatch(String,long
设置日志级别(或通常重新配置)log4j的另一种方法是使用JMX。Log4j将其日志程序注册为JMX MBean。使用应用程序服务器MBeanServer控制台(或JDK的jconsole.exe),可以重新配置每个单独的日志程序。这些更改不是永久性的,在重新启动应用程序(服务器)后,将重置为配置文件中设置的配置。
正如Aaron所描述的,您可以通过编程方式设置日志级别。您可以在应用程序中以您希望的方式实现它。例如,您可以有一个GUI,用户或管理员可以在其中更改日志级别,然后调用日志记录器上的setLevel()方法。是否在某个地方保留这些设置取决于您。
setLevel()
jutyujz03#
可以将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>
如果您正在部署到Tomcat示例、IDE内部或使用spring Boot ,则需要执行额外的步骤来实现此功能。这似乎有点超出了本文的范围,可能需要单独提出一个问题。
hfwmuf9z4#
对于log4j 2 API,可以使用
Logger logger = LogManager.getRootLogger(); Configurator.setAllLevels(logger.getName(), Level.getLevel(level));
jutyujz05#
对于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"); } }
只需使用适当的配置名称调用它,并确保将模板放在类路径中。
rkttyhzu6#
此答案不会帮助您动态更改日志记录级别,您需要重新启动服务,如果您可以重新启动服务,请使用以下解决方案
我这样做是为了改变log4j日志级别,它对我很有效,我没有引用任何文档。我用这个系统属性值来设置我的日志文件名。我用同样的技术来设置日志级别,它也很有效将其作为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>
66bbxpm57#
我已经成功地使用了这种方法来减少“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);
62lalag48#
如果要更改所有事件记录程序的事件记录级别,请使用下面的方法。这将枚举所有事件记录程序,并将事件记录级别更改为给定级别。请确保不要在log4j.properties文件中设置log4j.appender.loggerName.Threshold=DEBUG属性。
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); } }
fdbelqdn9#
您可以使用以下代码片段
((ch.qos.logback.classic.Logger)LoggerFactory.getLogger(packageName)).setLevel(ch.qos.logback.classic.Level.toLevel(logLevel));
9条答案
按热度按时间thigvfpy1#
更改日志级别很简单;修改配置的其它部分将提出更深入的方法。
这些更改在
Logger
的整个生命周期内都是永久性的。重新初始化时,将读取配置并将其用作运行时设置级别,而不会保留级别更改。**UPDATE:**如果您使用Log4j 2,则应根据documentation删除对
setLevel
的调用,因为这可以通过实现类实现。API中不支持对logger.setLevel()或类似方法的调用。应用程序应删除这些方法。Log4j 2实现类中提供了等效的功能,但可能会使应用程序容易受到Log4j 2内部更改的影响。
pvabu6sv2#
文件监视程序
Log4j能够监视
log4j.xml
文件的配置更改。如果更改log4j文件,log4j将根据您的更改自动刷新日志级别。有关详细信息,请参阅org.apache.log4j.xml.DOMConfigurator.configureAndWatch(String,long
的文档。检查之间的默认等待时间为60秒。这些更改将是永久性的。因为您直接更改了文件系统上的配置文件。您所需要做的就是调用DOMConfigurator.configureAndWatch()一次。JMX
设置日志级别(或通常重新配置)log4j的另一种方法是使用JMX。Log4j将其日志程序注册为JMX MBean。使用应用程序服务器MBeanServer控制台(或JDK的jconsole.exe),可以重新配置每个单独的日志程序。这些更改不是永久性的,在重新启动应用程序(服务器)后,将重置为配置文件中设置的配置。
自制
正如Aaron所描述的,您可以通过编程方式设置日志级别。您可以在应用程序中以您希望的方式实现它。例如,您可以有一个GUI,用户或管理员可以在其中更改日志级别,然后调用日志记录器上的
setLevel()
方法。是否在某个地方保留这些设置取决于您。jutyujz03#
可以将Log4j2配置为通过以给定的时间间隔扫描log4j2.xml文件(或等效文件)来刷新其配置。只需将“monitorInterval”参数添加到您的配置标记中。请参阅示例log4j2.xml文件的第2行,该行告诉log4j如果自上次日志事件以来已过去5秒以上,则重新扫描其配置。
如果您正在部署到Tomcat示例、IDE内部或使用spring Boot ,则需要执行额外的步骤来实现此功能。这似乎有点超出了本文的范围,可能需要单独提出一个问题。
hfwmuf9z4#
对于log4j 2 API,可以使用
jutyujz05#
对于log4j 1.x,我发现最好的方法是使用DOMConfigurator提交一组预定义的XML日志配置中的一个(比如说,一个用于正常使用,一个用于调试)。
利用这些可以这样做:
只需使用适当的配置名称调用它,并确保将模板放在类路径中。
rkttyhzu6#
此答案不会帮助您动态更改日志记录级别,您需要重新启动服务,如果您可以重新启动服务,请使用以下解决方案
我这样做是为了改变log4j日志级别,它对我很有效,我没有引用任何文档。我用这个系统属性值来设置我的日志文件名。我用同样的技术来设置日志级别,它也很有效
将其作为JVM参数传递(我使用Java 1.7)
抱歉,这不会动态更改日志记录级别,需要重新启动服务
在log4j.properties文件中,我添加了以下条目
我试过了
一切都成功了,希望这对你有帮助!
我的pom.xml中有以下依赖项
66bbxpm57#
我已经成功地使用了这种方法来减少“org.apache.http”日志的冗长性:
62lalag48#
如果要更改所有事件记录程序的事件记录级别,请使用下面的方法。这将枚举所有事件记录程序,并将事件记录级别更改为给定级别。请确保不要在
log4j.properties
文件中设置log4j.appender.loggerName.Threshold=DEBUG
属性。fdbelqdn9#
您可以使用以下代码片段