wake-up-neo.net

Protokollierungsfehler in stderr und debug, Info in stdout mit log4j

Ich möchte die Protokollierung mit Apache log4j zu einer von mir entwickelten Anwendung hinzufügen. An dieser Stelle möchte ich alle Protokollmeldungen für Level INFO und niedriger (TRACE, DEBUG) an stdout und alle anderen Protokollnachrichten von WARN und höher (ERROR, FATAL) an stderr ..__ umleiten. Beispiel:

...
logger.info("Processing at some point"); // must be written to stdout
logger.debug("Point x was processed"); // must be written to stdout
logger.warn("Incorrect point config"); // must be written only to stderr
logger.error("Exception occurred at point x"); // must be written only to stderr

Was sollte also meine log4j.properties-Datei sein? So sieht es zu diesem Moment aus:

log4j.rootLogger=DEBUG, stdout, stderr

# configure stdout
# set the conversion pattern of stdout
# Print the date in ISO 8601 format
log4j.appender.stdout = org.Apache.log4j.ConsoleAppender
log4j.appender.stdout.Threshold = DEBUG
log4j.appender.stdout.Target   = System.out
log4j.appender.stdout.layout = org.Apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = %-5p %d [%t][%F:%L] : %m%n

# configure stderr
# set the conversion pattern of stdout
# Print the date in ISO 8601 format
log4j.appender.stderr = org.Apache.log4j.ConsoleAppender
log4j.appender.stderr.Threshold = WARN
log4j.appender.stderr.Target   = System.err
log4j.appender.stderr.layout = org.Apache.log4j.PatternLayout
log4j.appender.stderr.layout.ConversionPattern = %-5p %d [%t][%F:%L] : %m%n

Das Problem bei der obigen Konfiguration ist, dass die Datei logger.error () ... auch bei stdout gedruckt wird.

53
Elvis

Per Jon Skeets vorheriger Beitrag bei Beitrag

leider gibt es keine maximum -Schwelle, also wo auch immer Debug-Meldungen erhalten Sie auch Warnmeldungen. Das ist ein bisschen schmerzhaft, IMO.

10
John B

Im Folgenden auch im Eigenschaftendateiformat gelöst. Der Trick bestand darin, die Filterdefinition richtig zu machen. Log4j-Eigenschaftsinformationen hier

Der ursprüngliche Versuch wurde geändert, um WARN & ERROR zu filtern:

log4j.rootLogger=TRACE, stdout, stderr

# configure stdout
# set the conversion pattern of stdout
# Print the date in ISO 8601 format
log4j.appender.stdout = org.Apache.log4j.ConsoleAppender
log4j.appender.stdout.Threshold = TRACE
log4j.appender.stdout.Target   = System.out
log4j.appender.stdout.layout = org.Apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = %-5p %d [%t][%F:%L] : %m%n
log4j.appender.stdout.filter.filter1=org.Apache.log4j.varia.LevelRangeFilter
log4j.appender.stdout.filter.filter1.levelMin=TRACE
log4j.appender.stdout.filter.filter1.levelMax=INFO

# configure stderr
# set the conversion pattern of stdout
# Print the date in ISO 8601 format
log4j.appender.stderr = org.Apache.log4j.ConsoleAppender
log4j.appender.stderr.Threshold = WARN
log4j.appender.stderr.Target   = System.err
log4j.appender.stderr.layout = org.Apache.log4j.PatternLayout
log4j.appender.stderr.layout.ConversionPattern = %-5p %d [%t][%F:%L] : %m%n
45
Jonas Berlin
  1. anstelle der .properties-Konfiguration müssen Sie eine XML-Konfiguration verwenden.
  2. Fügen Sie in .xml config ein Element namens "filter" vom Typ "org.Apache.log4j.varia.LevelRangeFilter" ein und legen Sie seine Parameter LevelMax und LevelMin fest. 

Beispielsweise definiert die folgende XML-Konfiguration zwei Appender: stdout, stderr. Stdout druckt alle Protokolle, deren Level kleiner oder gleich INFO ist, und stderr gibt alle Protokolle mit einem höheren Pegel als INFO an stderr aus.

<?xml version="1.0" encoding="UTF-8"?>
<!--
    Document    : log4j.xml
    Created on  : 13 Δεκέμβριος 2011, 3:55 μμ
    Author      : elitex
    Description : Purpose of the document follows.
-->
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd" >
<log4j:configuration>
    <appender name="stderr" class="org.Apache.log4j.ConsoleAppender">
        <param name="threshold" value="warn" />
        <param name="target" value="System.err"/>
        <layout class="org.Apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%-5p %d [%t][%F:%L] : %m%n" />
        </layout>
    </appender>
    <appender name="stdout" class="org.Apache.log4j.ConsoleAppender">
        <param name="threshold" value="debug" />
        <param name="target" value="System.out"/>
        <layout class="org.Apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%-5p %d [%t][%F:%L] : %m%n" />
        </layout>
        <filter class="org.Apache.log4j.varia.LevelRangeFilter">
            <param name="LevelMin" value="debug" />
            <param name="LevelMax" value="info" />
        </filter>
    </appender>
    <root>
        <priority value="debug"></priority>
        <appender-ref ref="stderr" />
        <appender-ref ref="stdout" />
    </root>
</log4j:configuration>

Weitere Informationen finden Sie unter: http://www.laliluna.de/articles/posts/log4j-tutorial.html

7
Raedwald

ein weiteres Beispiel, das die Variable ThresholdFilter aus log4j2 verwendet. 

<Console name="ConsoleERR" target="SYSTEM_ERR">
    <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level - %msg%n"/>
    <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
</Console>

Siehe doc .

2
Aurelien

Wenn Sie ihn auf NEUTRAL ändern und einen Filter für DEBUG hinzufügen, sollte dies auch DEBUG erfassen. Es gibt einen weiteren eingebauten Filter, der janino Abhängigkeit erfordert: 

    <filter class="ch.qos.logback.core.filter.EvaluatorFilter">      
        <evaluator> 
            <expression>
                   <![CDATA[ level > INFO ]]>
            </expression>
        </evaluator>
        <OnMatch>DENY</OnMatch>
        <OnMismatch>NEUTRAL</OnMismatch>
    </filter>
0
Andy S

Dies ist eine Logback-Konfiguration, die genau (!) Das macht, wonach Sie fragen:

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true" scan="true" scanPeriod="30 seconds">

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <target>System.out</target>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <encoder>
            <pattern>
                %-4relative [%thread] %-5level %logger - %msg%n
            </pattern>
        </encoder>
    </appender>

    <appender name="STDERR" class="ch.qos.logback.core.ConsoleAppender">
        <target>System.err</target>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>WARN</level>
        </filter>
        <encoder>
            <pattern>
                %-4relative [%thread] %-5level %logger - %msg%n
            </pattern>
        </encoder>
    </appender>

    <root level="${LOGBACK_ROOT_LEVEL:-INFO}">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="STDERR" />
    </root>

</configuration>
0
Petro Semeniuk