log4j2 несколько приложений, несколько регистраторов в config.xml

Я пытаюсь настроить конфигурацию log4j2 xml и не получаю желаемых результатов. Я хочу, чтобы моя консоль получала информацию об уровне и выше, а приложение с подвижным файлом (стандартное) для получения отладки уровня и выше. Затем я хочу ограничить 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>

person phomlish    schedule 30.12.2013    source источник


Ответы (4)


Во-первых, похоже, что ваша конфигурация предназначена для 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>
person Remko Popma    schedule 31.12.2013
comment
Предупреждение для начинающих пользователей: установка уровня на узле Logger действует как ограничение или ограничение. например, <Logger name="..." level="info"><appender-ref ref="common-log" level="trace" /><Logger>, ограничит все записи вашего журнала общим журналом до INFO. Чтобы удалить это, вы можете установить уровень на узле Logger на all или просто удалить его и явно объявить приложением. - person hfontanez; 09.04.2018

Если по какой-либо причине вы хотите ограничить использование appender определенным LogLevel. Наверное, правильный ответ - использовать фильтры. Пожалуйста, взгляните на специальный журнал для уровней

person N0mi    schedule 31.12.2013

Решил это с помощью 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>

Я не могу поверить, что такой простой вариант использования не поддерживается по умолчанию.

person Joan    schedule 15.11.2016

Я добавил эту зависимость, и это решило мою проблему.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
person Nahid    schedule 16.11.2019