web-dev-qa-db-fra.com

Erreur de journalisation sur stderr et debug, information sur stdout avec log4j

Je souhaite ajouter la journalisation à une application que je développe en utilisant Apache log4j. À ce stade, je souhaite rediriger tous les messages de journal de niveau INFO et inférieur (TRACE, DEBUG) vers stdout et tous les autres messages de journal de WARN et des versions ultérieures (ERROR, FATAL) vers stderr .

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

Alors, quel devrait être mon fichier log4j.properties? Voici à quoi ressemble ce momment:

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

Le problème avec la configuration ci-dessus est que logger.error () ... est également imprimé sur stdout.

53
Elvis

Le post précédent de Jon Skeet sur Post

malheureusement, il n'y a pas de seuil maximum, donc où que vous obteniez messages de débogage, vous obtenez également des messages d’avertissement. C'est un peu pénible, OMI.

10
John B

Résolu ci-dessous également dans le format de fichier de propriétés. L'astuce consistait à définir correctement le filtre. Log4j propriétés info ici

La tentative d'origine, modifiée pour filtrer WARN & ERROR:

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. au lieu d'utiliser la configuration .properties, vous devez utiliser une configuration .xml.
  2. Dans la configuration .xml, insérez un élément "filter" de type "org.Apache.log4j.varia.LevelRangeFilter" et définissez ses paramètres LevelMax et LevelMin

Par exemple, la configuration .xml suivante définit deux ajouts: stdout, stderr. Stdout imprime tous les journaux dont le niveau est inférieur ou égal à INFO sur stdout, et stderr imprime tous les journaux dont le niveau est supérieur à INFO sur stderr.

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

Pour plus d'informations, consultez: http://www.laliluna.de/articles/posts/log4j-tutorial.html

7
Raedwald

un autre exemple utilisant le balisage ThresholdFilter de log4j2. 

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

Voir le doc .

2
Aurelien

Le changer en NEUTRE et ajouter un filtre pour DEBUG devrait également permettre de capturer DEBUG. Il existe un autre filtre intégré qui nécessite janino dependency: 

    <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

C'est la configuration de journal qui fait exactement (!) Ce que vous demandez:

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