Java log4j2 多个 appender,config.xml 中的多个记录器

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/20838271/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-13 04:42:44  来源:igfitidea点击:

log4j2 multiple appenders, multiple loggers in config.xml

javaloggingconfigurationlog4jlog4j2

提问by phomlish

I am trying to setup a log4j2 xml config and am not getting the results I desire. I want my console to get level info and above, and the rolling file appender (standard) to get level debug and above. I then want to restrict 3 classes in the console appender to only receive warn and above. However, when I add these logger entries my standard appender also stops receiving the info and debug levels for these 3 classes. What should I do to only restrict console and not standard?

我正在尝试设置 log4j2 xml 配置,但没有得到我想要的结果。我希望我的控制台获得级别信息及更高级别,以及滚动文件附加程序(标准)以获得级别调试及更高级别。然后我想限制控制台附加程序中的 3 个类只接收警告及以上。但是,当我添加这些记录器条目时,我的标准 appender 也停止接收这 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>

回答by Remko Popma

First, it looks like your config is for log4j-1.x, not log4j2. You'll need to convert this if you want to use log4j2. (The manual has many examples for the new syntax.)

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

It originally thought you might need to use the log4j2 ThresholdFilter (http://logging.apache.org/log4j/2.x/manual/filters.html#ThresholdFilter), but this may be a simpler way:

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

(BTW, the layout patterns in the example config below still need some work to match your original config.)

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

<?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>

回答by N0mi

If by any chance you want to restrict to use appender to specific LogLevel. Probably the right answer is to use filters. Kindly take a look at specific logger for levels

如果您想限制使用 appender 到特定的 LogLevel。可能正确的答案是使用过滤器。请查看特定记录器的级别

回答by Joan

Solved it using GEventEvaluatorwith custom Groovy scripting: http://logback.qos.ch/manual/filters.html#GEventEvaluator

使用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>

I can't believe this so simple usecase is not supported by default.

我不敢相信这个如此简单的用例在默认情况下不受支持。

回答by Nahid

I added this dependency and it resolved my issue.

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

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