为什么两个 Logger 在 Log4j 中不按级别拆分消息?
Why two Loggers do not split messages according to their levels in Log4j?
我想将所有记录器级别记录到一个文件 (FATAL-> ALL) 并同时在控制台中显示 ERROR 级别和更高级别。我正在使用根记录器将所有级别记录到一个文件,并使用单独的记录器将错误级别记录到控制台。我的 XML 配置文件如下所示:
<?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] %highlight{%level}{FATAL=bg_red, ERROR=red, WARN=yellow, INFO=blue} %logger{36} - %msg%n" disableAnsi="false"/>
</Console>
<File name="File" fileName="output.log" bufferedIO="true" >
<PatternLayout
pattern="%d{HH:mm:ss.SSS} [%t] %highlight{%level}{FATAL=bg_red, ERROR=red, WARN=yellow, INFO=blue} %logger{36} - %msg%n"/>
</File>
</Appenders>
<Loggers>
<Root level="ALL">
<AppenderRef ref="File"/>
</Root>
<Logger name="com.danielk" level="ERROR">
<AppenderRef ref="Console"/>
</Logger>
</Loggers>
</Configuration>
我希望在文件中拥有所有级别的日志记录,并且在控制台中只有 "Error" 及以上级别,但我在两者(控制台和文件)上只有 "Error" 级别:
23:19:54.422 [main] ERROR com.danielk.Example - error error error from Example
23:19:54.434 [main] ERROR com.danielk.Main - ERROR ERROR ERROR FROM MAIN
消息本身是正确构建的,因为当我将两个记录器(根和附加)设置为 "ALL" 级别时,我可以看到所有类型的消息(不仅是 "Error" 级别)。
拆分关卡怎么办:
- 文件 - 所有级别
- 控制台 - 仅限错误及以上?
您可以在控制台附加程序上使用 ThresholdFilter
来过滤掉具有 ERROR
或更具体级别 (https://logging.apache.org/log4j/2.x/manual/filters.html#ThresholdFilter) 的日志事件。
整个配置例如:
<?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] %highlight{%level}{FATAL=bg_red, ERROR=red, WARN=yellow, INFO=blue} %logger{36} - %msg%n"
disableAnsi="false"/>
<ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
</Console>
<File name="File" fileName="output.log" bufferedIO="true" append="false">
<PatternLayout
pattern="%d{HH:mm:ss.SSS} [%t] %highlight{%level}{FATAL=bg_red, ERROR=red, WARN=yellow, INFO=blue} %logger{36} - %msg%n"/>
</File>
</Appenders>
<Loggers>
<Root level="debug">
<AppenderRef ref="File"/>
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
PS 当您指定:
<Logger name="com.danielk" level="ERROR">
<AppenderRef ref="Console"/>
</Logger>
然后将所有子包的日志级别设置为 ERROR
并在 com.danielk
内设置 类 (除非您配置更具体的记录器,例如 com.danielk.db.MyClass
使用不同的等级)。这就是日志文件中只出现错误的原因。
我想将所有记录器级别记录到一个文件 (FATAL-> ALL) 并同时在控制台中显示 ERROR 级别和更高级别。我正在使用根记录器将所有级别记录到一个文件,并使用单独的记录器将错误级别记录到控制台。我的 XML 配置文件如下所示:
<?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] %highlight{%level}{FATAL=bg_red, ERROR=red, WARN=yellow, INFO=blue} %logger{36} - %msg%n" disableAnsi="false"/>
</Console>
<File name="File" fileName="output.log" bufferedIO="true" >
<PatternLayout
pattern="%d{HH:mm:ss.SSS} [%t] %highlight{%level}{FATAL=bg_red, ERROR=red, WARN=yellow, INFO=blue} %logger{36} - %msg%n"/>
</File>
</Appenders>
<Loggers>
<Root level="ALL">
<AppenderRef ref="File"/>
</Root>
<Logger name="com.danielk" level="ERROR">
<AppenderRef ref="Console"/>
</Logger>
</Loggers>
</Configuration>
我希望在文件中拥有所有级别的日志记录,并且在控制台中只有 "Error" 及以上级别,但我在两者(控制台和文件)上只有 "Error" 级别:
23:19:54.422 [main] ERROR com.danielk.Example - error error error from Example 23:19:54.434 [main] ERROR com.danielk.Main - ERROR ERROR ERROR FROM MAIN
消息本身是正确构建的,因为当我将两个记录器(根和附加)设置为 "ALL" 级别时,我可以看到所有类型的消息(不仅是 "Error" 级别)。
拆分关卡怎么办:
- 文件 - 所有级别
- 控制台 - 仅限错误及以上?
您可以在控制台附加程序上使用 ThresholdFilter
来过滤掉具有 ERROR
或更具体级别 (https://logging.apache.org/log4j/2.x/manual/filters.html#ThresholdFilter) 的日志事件。
整个配置例如:
<?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] %highlight{%level}{FATAL=bg_red, ERROR=red, WARN=yellow, INFO=blue} %logger{36} - %msg%n"
disableAnsi="false"/>
<ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
</Console>
<File name="File" fileName="output.log" bufferedIO="true" append="false">
<PatternLayout
pattern="%d{HH:mm:ss.SSS} [%t] %highlight{%level}{FATAL=bg_red, ERROR=red, WARN=yellow, INFO=blue} %logger{36} - %msg%n"/>
</File>
</Appenders>
<Loggers>
<Root level="debug">
<AppenderRef ref="File"/>
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
PS 当您指定:
<Logger name="com.danielk" level="ERROR">
<AppenderRef ref="Console"/>
</Logger>
然后将所有子包的日志级别设置为 ERROR
并在 com.danielk
内设置 类 (除非您配置更具体的记录器,例如 com.danielk.db.MyClass
使用不同的等级)。这就是日志文件中只出现错误的原因。