我有一个小问题,找不到解决方案。我想为级别信息而不是级别警告设置图案布局。如果我的登录级别为INFO,则一切正常,但如果日志级别为INFOWARN
它被写入控制台两次(作为级别信息和级别警告)。简而言之,特定级别的所有日志都会写出该级别及其下级别的日志。
我想将 INFO 级别登录到控制台,如下所示:"%-5level %d{dd-MM-yyyy HH:mm:ss} %msg%n"
和水平WARN
like "%-5level %d{dd-MM-yyyy HH:mm:ss} [%l] %msg%n"
.
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
<Appenders>
<Console name="ConsoleInfo" target="SYSTEM_OUT">
<ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="%-5level %d{dd-MM-yyyy HH:mm:ss} %msg%n"/>
</Console>
<Console name="ConsoleWarning" target="SYSTEM_OUT">
<ThresholdFilter level="WARN" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="%-5level %d{dd-MM-yyyy HH:mm:ss} [%l] %msg%n"/>
</Console>
<File name="File" fileName="logs/cli.log">
<PatternLayout pattern="%-5level %d{dd-MM-yyyy HH:mm:ss} [%l] %msg%n"/>
</File>
</Appenders>
<Loggers>
<Root level="ALL">
<AppenderRef ref="ConsoleInfo"/>
<AppenderRef ref="ConsoleWarning"/>
<AppenderRef ref="File"/>
</Root>
</Loggers>
</Configuration>
据我了解,您希望将 WARN 或更高级别(WARN、ERROR、FATAL)的日志事件仅发送到“ConsoleWarning”附加程序,而不是同时发送到“ConsoleWarning”和“ConsoleInfo”。
最简单的方法是修改“ConsoleInfo”附加程序中的过滤器配置,基本上执行相反的方法,如下所示:
<Console name="ConsoleInfo" target="SYSTEM_OUT">
<ThresholdFilter level="WARN" onMatch="DENY" onMismatch="ACCEPT"/>
<PatternLayout pattern="%-5level %d{dd-MM-yyyy HH:mm:ss} %msg%n"/>
</Console>
这是有效的,因为作为log4j2 手册状态:
如果 LogEvent 中的级别相同,则此过滤器返回 onMatch 结果或者比更具体否则配置的级别和 onMismatch 值。例如,如果 ThresholdFilter 配置为 ERROR 级别,并且 LogEvent 包含 DEBUG 级别,则将返回 onMismatch 值,因为 ERROR 事件比 DEBUG 更具体。
这将导致附加程序仅接受级别低于 WARN 的事件。
另一种可能的解决方案是使用路由附加器指定每个级别的目的地。如果您这样做,那么您根本不需要 ThresholdFilters。另请注意,您可以通过不提供默认路由以及不提供该级别的路由来忽略特定级别的事件。例如,如果您删除<Route ref="ConsoleInfo" key="DEBUG" />
根据下面的配置,所有 DEBUG 事件都将被路由附加器忽略,并且不会打印到控制台。这是配置:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
<Appenders>
<Console name="ConsoleInfo" target="SYSTEM_OUT">
<PatternLayout pattern="%-5level %d{dd-MM-yyyy HH:mm:ss} %msg%n"/>
</Console>
<Console name="ConsoleWarning" target="SYSTEM_OUT">
<PatternLayout pattern="%-5level %d{dd-MM-yyyy HH:mm:ss} [%l] %msg%n"/>
</Console>
<File name="File" fileName="logs/cli.log">
<PatternLayout pattern="%-5level %d{dd-MM-yyyy HH:mm:ss} [%l] %msg%n"/>
</File>
<Routing name="Routing">
<Routes>
<Script name="RoutingInit" language="JavaScript"><![CDATA[
logEvent.getLevel();]]>
</Script>
<Route ref="ConsoleInfo" key="TRACE" />
<Route ref="ConsoleInfo" key="DEBUG" />
<Route ref="ConsoleInfo" key="INFO" />
<Route ref="ConsoleWarning" key="WARN" />
<Route ref="ConsoleWarning" key="ERROR" />
<Route ref="ConsoleWarning" key="FATAL" />
</Routes>
</Routing>
</Appenders>
<Loggers>
<Root level="ALL">
<AppenderRef ref="Routing"/>
<AppenderRef ref="File"/>
</Root>
</Loggers>
</Configuration>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)