web-dev-qa-db-fra.com

Fichier de configuration XML log4j2 très simple avec Console et File appender

Je voudrais un fichier de configuration XML très simple avec une console et un appender de fichier utilisant log4j2.

(Le site Web Apache me tue avec beaucoup d'informations.)

205
Thorsten Niehues
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        </Console>
        <File name="MyFile" fileName="all.log" immediateFlush="false" append="false">
            <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </File>
    </Appenders>
    <Loggers>
        <Root level="debug">
            <AppenderRef ref="Console" />
            <AppenderRef ref="MyFile"/>
        </Root>
    </Loggers>
</Configuration>

Notes:

  • Placez le contenu suivant dans votre fichier de configuration.
  • Nommez le fichier de configuration log4j2.xml
  • Placez le log4j2.xml dans un dossier qui se trouve dans le chemin de la classe (c’est-à-dire votre dossier source "src")
  • Utilisez Logger logger = LogManager.getLogger(); pour initialiser votre enregistreur
  • J'ai mis le immediateFlush = "false" puisque c'est mieux pour durée de vie SSD. Si vous avez besoin du journal immédiatement dans votre fichier journal, supprimez le paramètre ou définissez-le sur true.
265
Thorsten Niehues

Voici mon log4j2.xml simpliste qui imprime sur la console et écrit dans un fichier roulant quotidien:

// Java
private static final Logger LOGGER = LogManager.getLogger(MyClass.class);


// log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Properties>
        <Property name="logPath">target/cucumber-logs</Property>
        <Property name="rollingFileName">cucumber</Property>
    </Properties>
    <Appenders>
        <Console name="console" target="SYSTEM_OUT">
            <PatternLayout pattern="[%highlight{%-5level}] %d{DEFAULT} %c{1}.%M() - %msg%n%throwable{short.lineNumber}" />
        </Console>
        <RollingFile name="rollingFile" fileName="${logPath}/${rollingFileName}.log" filePattern="${logPath}/${rollingFileName}_%d{yyyy-MM-dd}.log">
            <PatternLayout pattern="[%highlight{%-5level}] %d{DEFAULT} %c{1}.%M() - %msg%n%throwable{short.lineNumber}" />
            <Policies>
                <!-- Causes a rollover if the log file is older than the current JVM's start time -->
                <OnStartupTriggeringPolicy />
                <!-- Causes a rollover once the date/time pattern no longer applies to the active file -->
                <TimeBasedTriggeringPolicy interval="1" modulate="true" />
            </Policies>
        </RollingFile>
    </Appenders>
    <Loggers>
        <Root level="DEBUG" additivity="false">
            <AppenderRef ref="console" />
            <AppenderRef ref="rollingFile" />
        </Root>
    </Loggers>
</Configuration>

TimeBasedTriggeringPolicy

intervalle (entier) - Fréquence à laquelle une substitution doit avoir lieu en fonction de l'unité de temps la plus spécifique du modèle de date. Par exemple, avec un modèle de date avec les heures comme élément le plus spécifique et une incrémentation de 4 renversements se produisant toutes les 4 heures. La valeur par défaut est 1.

modulate (boolean) - Indique si l'intervalle doit être ajusté pour que le prochain basculement ait lieu sur la limite de l'intervalle. Par exemple, si l'élément est heures, si l'heure actuelle est 3 heures et l'intervalle est 4, le premier basculement aura lieu à 4 heures du matin et les suivants à 8 heures, midi, 16 heures, etc.

Source: https://logging.Apache.org/log4j/2.x/manual/appenders.html

Sortie:

[INFO ] 2018-07-21 12:03:47,412 ScenarioHook.beforeScenario() - Browser=CHROME32_NOHEAD
[INFO ] 2018-07-21 12:03:48,623 ScenarioHook.beforeScenario() - Screen Resolution (WxH)=1366x768
[DEBUG] 2018-07-21 12:03:52,125 HomePageNavigationSteps.I_Am_At_The_Home_Page() - Base URL=http://simplydo.com/projector/
[DEBUG] 2018-07-21 12:03:52,700 NetIncomeProjectorSteps.I_Enter_My_Start_Balance() - Start Balance=348000

Un nouveau fichier journal sera créé quotidiennement avec le jour précédent automatiquement renommé en:

cucumber_yyyy-MM-dd.log

Dans un projet Maven, vous placeriez le log4j2.xml dans src/main/resources ou src/test/resources.

18
silver

log4j2 a un système de configuration très flexible (IMHO est plus une distraction qu'une aide), vous pouvez même utiliser JSON. Voir https://logging.Apache.org/log4j/2.x/manual/configuration.html pour une référence.

Personnellement, j'ai récemment commencé à utiliser log4j2, mais je suis plutôt orienté vers la configuration "XML strict" (c'est-à-dire l'utilisation d'attributs plutôt que de noms d'éléments), qui peut être validée par un schéma.

Voici mon exemple simple d'utilisation de la configuration automatique et du mode strict, en utilisant une "propriété" pour définir le nom du fichier:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration monitorinterval="30" status="info" strict="true">
    <Properties>
        <Property name="filename">log/CelsiusConverter.log</Property>
    </Properties>
    <Appenders>
        <Appender type="Console" name="Console">
            <Layout type="PatternLayout" pattern="%d %p [%t] %m%n" />
        </Appender>
        <Appender type="Console" name="FLOW">
            <Layout type="PatternLayout" pattern="%C{1}.%M %m %ex%n" />
        </Appender>
        <Appender type="File" name="File" fileName="${filename}">
            <Layout type="PatternLayout" pattern="%d %p %C{1.} [%t] %m%n" />
        </Appender>
    </Appenders>
    <Loggers>
        <Root level="debug">
            <AppenderRef ref="File" />
            <AppenderRef ref="Console" />
            <!-- Use FLOW to trace down exact method sending the msg -->
            <!-- <AppenderRef ref="FLOW" /> -->
        </Root>
    </Loggers>
</Configuration>
12
Christof Kälin