java - 在不使用 log4j-core 的情况下从代码更新 LogLevel
问题描述
我想在不使用 log4j-core 的情况下以编程方式更新日志级别。可以使用 log4j-api 来完成吗?
解决方案
如果您将 log4j2 配置设置为使用DynamicThresholdFilter ,则可以动态更新日志级别。这是一个简单的例子:
首先,一个log4j2.xml文件来配置log4j2系统:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
<DynamicThresholdFilter key="myLogLvl" defaultThreshold="ERROR"
onMatch="ACCEPT" onMismatch="DENY">
<KeyValuePair key="TRACE" value="TRACE"/>
<KeyValuePair key="DEBUG" value="DEBUG"/>
<KeyValuePair key="INFO" value="INFO"/>
<KeyValuePair key="WARN" value="WARN"/>
<KeyValuePair key="FATAL" value="FATAL"/>
</DynamicThresholdFilter>
</Console>
</Appenders>
<Loggers>
<Root level="ALL">
<AppenderRef ref="Console" />
</Root>
</Loggers>
</Configuration>
请注意我是如何设置过滤器的,以便DynamicThresholdFilter
有一个键“myLogLvl”,然后有几个KeyValuePair
基于键“myLogLvl”中的值定义日志级别阈值ThreadContext
。我假设您想使用级别的名称作为您要放入的值ThreadContext
。
另请注意,我已将Root
记录器的级别设置为“ALL”。这样所有消息都将被记录器接受,然后由过滤器过滤。换句话说,我将过滤器放在控制哪些消息被接受而不是记录器上。
这是一个用于生成一些日志的简单 Java 类:
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.ThreadContext;
public class SomeClass {
private static final Logger log = LogManager.getLogger();
public static void main(String[] args){
ThreadContext.put("myLogLvl", "WARN");
if(log.isDebugEnabled())
log.debug("This is some debug! (This should not appear in console)");
log.info("Here's some info! (This should not appear in console)");
log.error("Some error happened! (We will see this in the console)");
//Maybe now I want INFO log level
ThreadContext.put("myLogLvl", "INFO");
log.info("This should now appear in the console");
log.debug("This still should --not-- appear");
log.fatal("This will also appear");
}
}
请注意,我首先将ThreadContext
变量“myLogLvl”设置为“WARN”,以便只接受“WARN”级别或更具体的消息。如果您不这样做,“myLogLvl”将没有值,这意味着过滤器中定义的默认级别也将不适用,因此所有消息都将被接受。
这是上面生成的示例输出:
10:39:44.668 [main] ERROR example.SomeClass - Some error happened! (We will see this in the console)
10:39:44.670 [main] INFO example.SomeClass - This should now appear in the console
10:39:44.670 [main] FATAL example.SomeClass - This will also appear
希望这可以帮助!
推荐阅读
- python - 如何在 PyTorch 中获取神经网络的编码器部分?
- angular - 角导航路由
- reactjs - React-Simple-Map 不缩放/地图非常小
- computer-vision - 如何检测移动的汽车和停止的汽车?
- javascript - 当尝试注册用户以“未经授权”响应时
- c# - Blazor WASM:ReadFromJsonAsync 时出错
- > 发霉
- c++ - 如何更改 QListWidget 中的滚动条边距
- html - 如何在它的前一个元素上显示一个元素 Vuetify
- python - 使用格式错误的 uid 删除用户时出现错误身份平台
- angular - 如何在 Angular 中处理异常 500 错误消息