【问题标题】:how to log only one level with log4j2?如何用 log4j2 只记录一个级别?
【发布时间】:2014-09-29 20:12:30
【问题描述】:

我在我的应用程序中使用 log4j2。

我想要的是到 'debug' 到控制台的所有内容,到 'info' 到 myapp.log 的所有内容,以及只有 'info' 到 'myapp-audit.log' 的所有内容。

原因是,INFO 主要包括对数据的成功修改(例如“用户创建”、“用户更新”、“用户删除”等)。 If 实际上是数据修改的审核日志。

但我不知道该怎么做。

如何仅获取“信息”以登录到“myapp-audit.log”?这是我目前的配置...

<?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" />
        </Console>

        <File name="LogFile" fileName="myapp.log">
            <PatternLayout
                pattern="%d{yyyy-mm-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        </File>

        <File name="AuditFile" fileName="myapp-audit.log">
            <PatternLayout
                pattern="%d{yyyy-mm-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        </File>
    </appenders>

    <loggers>
        <root level="debug">
            <appender-ref ref="Console" level="debug" />
            <appender-ref ref="LogFile" level="info" />
            <appender-ref ref="AuditFile" level="info" /> <!-- I want ONLY 'info' here -->
        </root>
    </loggers>
</configuration>

【问题讨论】:

    标签: java logging configuration log4j log4j2


    【解决方案1】:

    如果您在 appender-ref 中指定 INFO,则 appender 将接收 INFO、WARN、ERROR 和 FATAL 事件。您可以通过过滤掉 WARN、ERROR 和 FATAL 级别的事件进一步限制为仅 INFO:

    <File name="AuditFile" fileName="myapp-audit.log">
        <PatternLayout 
           pattern="%d{yyyy-mm-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%nZ" />
        <Filters>
    
            <!-- First deny warn, error and fatal messages -->
            <ThresholdFilter level="warn"  onMatch="DENY" onMismatch="NEUTRAL"/>
            <ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>
            <ThresholdFilter level="fatal" onMatch="DENY" onMismatch="NEUTRAL"/>
    
            <!-- Then accept info, warn, error, fatal and deny debug/trace -->
            <ThresholdFilter level="info"  onMatch="ACCEPT" onMismatch="DENY"/>
        </Filters>
    </File>
    

    【讨论】:

    • 这里不需要 errorfatal 过滤器,因为它们也被 warn的阈值过滤器匹配>.
    【解决方案2】:

    您不能直接这样做,因为info 级别包括“以上”的所有内容 - 警告、错误、致命。 您可以做的是创建一个单独的审计记录器。

    在课堂上:

    Logger log = LogManager.getLogger("audit");
    

    在xml中:

    <Logger name="audit" level="info">
       <Appender-ref ref="AuditFile" level="info" />
    </Logger>
    

    或者你可以使用RoutingAppender(你可以使用ThreadContext以外的东西):

    ThreadContext.put("ROUTINGFLAG", "audit");
    log.info("...");
    ThreadContext.remove("ROUTINGFLAG");
    

    在xml中:

    ...
        <Routing name="Routing">
            <Routes pattern="$${ctx:ROUTINGFLAG}">
                <Route AppenderRef="LogFile"/>              
                <Route AppenderRef="AuditFile" key="audit"/>                  
            </Routes>
        </Routing>
    </Appenders>
    <Loggers>
        <Root level="debug">
            <Appender-ref ref="Console" level="debug"/>
            <AppenderRef ref="Routing" level="info"/>
        </Root>
    </Loggers>
    

    【讨论】:

      【解决方案3】:

      您可以使用 LevelRangeFilter。 它有 minLevelma​​xLevel 属性(当然还有 onMatch 和 onMismatch)。

      例如(在 json 中)我们需要在控制台中仅在信息和警告级别上打印日志:

      "Appenders": {
        "Console": {
          "PatternLayout": {
            "pattern": "%d{yyyy-MMM-dd HH:mm:ss a} [%t] %-5level %logger{36} - %msg%n"
          },
          "name": "Console",
          "target": "SYSTEM_OUT",
          "LevelRangeFilter": {
            "minLevel": "warn",
            "maxLevel": "info",
            "onMatch": "ACCEPT",
            "onMismatch": "DENY"
          }
        }
      }
      

      如果你只想要信息级别,那么将“信息”写入属性最小值和最大值。

      【讨论】:

        【解决方案4】:

        补充 Remko Popma 的答案 - 您可以使用两个阈值过滤器拒绝高于和低于所需水平的任何内容。

        <File name="AuditFile" fileName="myapp-audit.log">
            <PatternLayout pattern="%d{yyyy-mm-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%nZ" />
            <Filters>
        
                <!-- Deny anything above INFO level -->
                <ThresholdFilter level="WARN" onMatch="DENY" onMismatch="NEUTRAL"/>
            
                <!-- Deny anything below INFO level -->
                <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
        
            </Filters>
        </File>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-08-21
          • 1970-01-01
          相关资源
          最近更新 更多