【问题标题】:log4j2 multiple appenders, multiple loggers in config.xmllog4j2 多个附加程序,config.xml 中的多个记录器
【发布时间】:2014-01-17 06:19:50
【问题描述】:

我正在尝试设置 log4j2 xml 配置,但没有得到我想要的结果。我希望我的控制台获得级别信息及以上,滚动文件附加程序(标准)获得级别调试及以上。然后我想限制控制台附加程序中的 3 个类只接收警告及以上。但是,当我添加这些记录器条目时,我的标准附加程序也停止接收这 3 个类的信息和调试级别。我应该怎么做才能只限制控制台而不是标准?

 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

<appender name="console" class="org.apache.log4j.ConsoleAppender"> 
    <param name="Target" value="System.out"/> 
    <param name="threshold" value="info" />
    <layout class="org.apache.log4j.PatternLayout"> 
        <param name="ConversionPattern" value="%d{ABSOLUTE} %-5p %c [%t] %X{ctx} ~ %m%n" />
    </layout> 
</appender> 

<appender name="standard" class="org.apache.log4j.DailyRollingFileAppender">
    <param name="file" value="logs/broadcast.log" />
    <param name="DatePattern" value="'.'yyyy-MM-dd" />
    <param name="threshold" value="debug" />
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d{DATE} %-5p %c{1} [%t] %X{ctx} ~ %m%n" />
    </layout>   
</appender>

<appender name="stderr" class="org.apache.log4j.FileAppender">
    <param name="file" value="logs/broadcast.err" />
    <param name="threshold" value="error" />
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d{DATE} %-5p %c{1} [%t] %X{ctx} ~ %m%n" />
    </layout>
</appender>

 <appender name="jlv" class="org.apache.log4j.net.SocketAppender">
    <param name="remoteHost" value="localhost"/>
    <param name="port" value="4445"/>
    <param name="locationInfo" value="true"/>
  </appender>

<logger name="com.mydetv.broadcast.BroadcastLoop">
    <level value="warn"/>
    <appender-ref ref="console" />
</logger>
<logger name="com.mydetv.broadcast.BroadcastUpdate22">
    <level value="warn"/>
    <appender-ref ref="console" />
</logger>
<logger name="com.mydetv.broadcast.vlc.VlcRequest22">
    <level value="warn"/>
    <appender-ref ref="console" />
</logger>

<root> 
    <priority value ="debug" /> 
    <appender-ref ref="standard" /> 
    <appender-ref ref="stderr"/> 
    <appender-ref ref="console" /> 
    <appender-ref ref="jlv"/>
</root>

</log4j:configuration>

【问题讨论】:

    标签: java logging configuration log4j log4j2


    【解决方案1】:

    首先,您的配置似乎适用于 log4j-1.x,而不是 log4j2。如果你想使用 log4j2,你需要转换它。 (手册中有许多新语法的示例。)

    最初认为您可能需要使用 log4j2 ThresholdFilter (http://logging.apache.org/log4j/2.x/manual/filters.html#ThresholdFilter),但这可能是一种更简单的方法:

    (顺便说一句,下面示例配置中的布局模式仍然需要一些工作来匹配您的原始配置。)

    <?xml version="1.0" encoding="UTF-8"?>
    <Configuration status="warn" name="MyApp" packages="">
      <Appenders>
        <RollingFile name="RollingFile" fileName="logs/app.log" filePattern="logs/app-%d{MM-dd-yyyy}.log.gz"
                     ignoreExceptions="false">
          <PatternLayout>
            <Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
          </PatternLayout>
          <TimeBasedTriggeringPolicy />
        </RollingFile>
        <Console name="STDOUT" target="SYSTEM_OUT" ignoreExceptions="false">
          <PatternLayout pattern="%m%n"/>
        </Console>
      </Appenders>
      <Loggers>
         <Logger name="com.mysetv.broadcast.BroadcastLoop" level="trace" additivity="false">
          <AppenderRef ref="STDOUT" level="warn" />
          <AppenderRef ref="RollingFile"/>
        </Logger>
    ... (add other named loggers here)...
       <Root level="trace">
          <AppenderRef ref="STDOUT" level="info" />
          <AppenderRef ref="RollingFile"/>
        </Root>
      </Loggers>
    </Configuration>
    

    【讨论】:

    • 对初学者用户的警告:在Logger 节点上设置级别作为上限或限制。例如,&lt;Logger name="..." level="info"&gt;&lt;appender-ref ref="common-log" level="trace" /&gt;&lt;Logger&gt;,会将公共日志中的所有日志条目限制为INFO。要删除它,您可以将 Logger 节点上的级别设置为 all 或简单地将其删除并由 appender 显式声明。
    【解决方案2】:

    如果你想限制使用 appender 到特定的 LogLevel。可能正确的答案是使用过滤器。欢迎关注specific logger for levels

    【讨论】:

      【解决方案3】:

      使用 GEventEvaluator 和自定义 Groovy 脚本解决了这个问题: http://logback.qos.ch/manual/filters.html#GEventEvaluator

      <configuration>
          <property name="LAYOUT" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{5} - %msg%n" />
      
          <root>
              <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
                  <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
                      <evaluator class="ch.qos.logback.classic.boolex.GEventEvaluator">
                          <expression>e.level.toInt() >= WARN.toInt()</expression>
                      </evaluator>
                      <OnMatch>ACCEPT</OnMatch>
                      <OnMismatch>DENY</OnMismatch>
                  </filter>
                  <encoder>
                      <pattern>${LAYOUT}</pattern>
                  </encoder>
              </appender>
      
              <appender name="FILE" class="ch.qos.logback.core.FileAppender">
                  <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
                      <evaluator class="ch.qos.logback.classic.boolex.GEventEvaluator">
                          <expression>
                              e.level.toInt() >= WARN.toInt() ||
                              (e.level.toInt() >= TRACE.toInt() &amp;&amp; e.getLoggerName().startsWith("my.package"))
                          </expression>
                      </evaluator>
                      <OnMatch>ACCEPT</OnMatch>
                      <OnMismatch>DENY</OnMismatch>
                  </filter>
                  <encoder>
                      <pattern>${LAYOUT}</pattern>
                  </encoder>
                  <File>target/log/test-log</File>
                  <append>false</append>
              </appender>
          </root>
      </configuration>
      

      我不敢相信这么简单的用例默认不支持。

      【讨论】:

        【解决方案4】:

        我添加了这个依赖,它解决了我的问题。

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
        </dependency>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-02-26
          • 2012-11-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多