java - 记录器消息的过滤级别

标签 java logging log4j2

我今天开始使用 Log4j 2,看到了三种指定消息级别的方法:
1. 使用 filter.threshold
2.在appender本身
3.或在rootLogger中
指定记录器的消息级别时推荐使用哪种方式?

我目前将此代码作为 Log4j2 conf 文件:

status = error
dest = err
name = PropertiesConfig

property.filename = logs/log.log

filter.threshold.type = ThresholdFilter
filter.threshold.level = trace

appender.console.type = Console
appender.console.name = ConsoleLogger
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = [%t.%-15c{1}] [%p] %d{HH:mm:ss.SSS} - %m%n
appender.console.filter.threshold.type = ThresholdFilter
appender.console.filter.threshold.level = trace

appender.randomAccessFile.type = RandomAccessFile
appender.randomAccessFile.name = File
appender.randomAccessFile.filename = logs/log.log
appender.randomAccessFile.immediateFlush = false
appender.randomAccessFile.append = false
appender.randomAccessFile.layout.type = PatternLayout
appender.randomAccessFile.layout.pattern = %-10[%t.%c{1}] [%p] %d{HH:mm:ss.SSS} - %m%n
appender.randomAccessFile.filter.threshold.type = ThresholdFilter
appender.randomAccessFile.filter.threshold.level = trace

rootLogger.level = trace
rootLogger.includeLocation = false
rootLogger.appenderRef.stdout.ref = ConsoleLogger
rootLogger.appenderRef.file.ref = File

如您所见,我在 3 个地方有关卡。我认为那些 appender 过滤器用于那些特定的日志记录接口(interface)和 rootLogger.level 用于全局过滤器,但是这段代码是做什么的?这是默认值还是什么?
filter.threshold.type = ThresholdFilter
filter.threshold.level = trace

最佳答案

来自 log4j documentation -

Filters may be configured in one of four locations:

  1. Context-wide Filters are configured directly in the configuration. Events that are rejected by these filters will not be passed to loggers for further processing. Once an event has been accepted by a Context-wide filter it will not be evaluated by any other Context-wide Filters nor will the Logger's Level be used to filter the event. The event will be evaluated by Logger and Appender Filters however.
  2. Logger Filters are configured on a specified Logger. These are evaluated after the Context-wide Filters and the Log Level for the Logger. Events that are rejected by these filters will be discarded and the event will not be passed to a parent Logger regardless of the additivity setting.
  3. Appender Filters are used to determine if a specific Appender should handle the formatting and publication of the event.
  4. Appender Reference Filters are used to determine if a Logger should route the event to an appender.


简而言之,以下是过滤日志消息的过滤顺序 -
  • 上下文过滤器
  • 在记录器级别声明的级别
  • 附加过滤器

  • 如果级别在较低的序列中变得特定,则再次过滤日志消息。例如如果在上下文过滤器中设置的级别是 WARN在 appender 过滤器中设置的级别是 ERROR ,然后使用 ERROR 记录消息日志级别将被记录。

    如果级别在较低序列中变得通用,则使用在较高序列中设置的级别。例如如果在上下文过滤器中设置的级别是 WARN在记录器级别设置的级别是INFO ,然后使用 WARN 记录消息日志级别将被转发到 appender。

    现在,通过上面的解释,您可以理解每个过滤器序列都有自己的控制范围。对于一个小的配置文件,您可能会认为它不是很有用,但如果您有一个带有多个附加程序和记录器的大型配置文件,它会非常有用。

    所以,没有推荐的配置。鉴于您的配置,我更愿意删除上下文范围的过滤器和附加过滤器。而是创建一个 Logger并使用 Logger 控制日志级别. RootLogger级别一般设置为WARNERROR避免详细记录应用程序库。

    关于java - 记录器消息的过滤级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48310498/

    相关文章:

    java - Spring Boot 中的 Stripe 示例 Java 服务器?不兼容的类型 : Optional<StripeObject> cannot be converted to Source

    java - 找不到 log4j siftAppender 输出日志

    java - log4j2 找不到配置文件

    java - JUnit 测试可以从返回断言的对象解析吗?

    java - 用 Java 构建 IRC 机器人

    java - 如何在运行时启用/禁用 JMS 监听器?我可以创建一个在运行时启用/禁用监听器的 api 吗?

    python - Django 和 fcgi - 日志记录问题

    javascript - 有人使用 yui logger 来跟踪 yui 事件吗?有没有办法过滤它?

    logging - Log4j2 和 Jboss EAP 7 : Exceptions logging

    java - 为什么 log4j gc 免费日志记录不适合 webapp