Fichier de configuration XML log4j2 très simple à l'aide de Console et Appender File

223

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

Thorsten Niehues
la source
72
Haha - si heureux que vous ayez dit ceci "(Le site Web Apache me tue avec beaucoup d'informations.)"
Thonnor
19
Votre phrase (le site Web Apache me tue avec beaucoup d'informations) est la principale raison pour laquelle je vois votre question!
Ju Oliveira

Réponses:

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

Remarques:

  • Mettez 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 d'accès aux classes (c'est-à-dire votre dossier source "src")
  • Utilisez Logger logger = LogManager.getLogger();pour initialiser votre enregistreur
  • J'ai défini l' immédiatFlush = "false" car c'est mieux pour la durée de vie du SSD . Si vous avez besoin du journal immédiatement dans votre fichier journal, supprimez le paramètre ou définissez-le sur true
Thorsten Niehues
la source
1
Pour être complet, l'utilisation de immediateFlush = "false" est particulièrement recommandée lors de l'utilisation d'Async Loggers ou AsyncAppender.
Remko Popma
1
Contexte: immediateFlush = "false" permet aux composants asynchrones de Log4J2 de regrouper plusieurs événements de journal en une seule écriture de disque. En prime, vos événements de journal les plus récents sont toujours écrits sur le disque et ne restent jamais suspendus dans une mémoire tampon. (Quelque chose que j'ai trouvé ennuyeux à propos de log4j-1.2.)
Remko Popma
1
Je n'ai pas pu faire fonctionner les exemples sur le site Log4j 2.0 mais celui-ci l'a fait. Je vous remercie.
djangofan
12
Veuillez ajouter le fait qu'un nettoyage peut être requis pour ceux qui utilisent Eclipse. Pour le bien de l'humanité.
Reut Sharabani
1
@ThorstenNiehues Je ne peux pas modifier mon commentaire précédent, mais eclipse copie la configuration lorsque vous construisez, et pour une raison quelconque, il ne copie pas toujours le log4j.xml même s'il a changé. Du moins, c'est ce qui l'a résolu pour moi.
Reut Sharabani
19

Voici mon simpliste log4j2.xmlqui imprime sur la console et écrit dans un fichier tournant 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) - La fréquence à laquelle un roulement doit se produire en fonction de l'unité de temps la plus spécifique dans le modèle de date. Par exemple, avec un modèle de date avec les heures comme élément le plus spécifique et un incrément de 4 survols se produirait toutes les 4 heures. La valeur par défaut est 1.

moduler (booléen) - Indique si l'intervalle doit être ajusté pour provoquer le prochain basculement sur la limite d'intervalle. Par exemple, si l'élément est des heures, l'heure actuelle est de 3 heures du matin et l'intervalle est de 4, alors le premier survol aura lieu à 4 heures du matin, puis les prochains auront lieu à 8 heures, midi, 16 heures, etc.

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

Production:

[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 et le jour précédent sera automatiquement renommé:

cucumber_yyyy-MM-dd.log

Dans un projet Maven, vous mettriez le log4j2.xmldans src/main/resources ou src/test/resources .

argent
la source
12

log4j2 a un système de configuration très flexible (qui à mon humble avis 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 j'ai tendance à privilégier la configuration "XML stricte" (c'est-à-dire à utiliser des attributs au lieu des noms d'éléments), qui peut être validée par le schéma.

Voici mon exemple simple utilisant la configuration automatique et le mode strict, en utilisant une "propriété" pour définir le nom de 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>
Christof Kälin
la source
La configuration flexible est utile lorsque vous essayez de séparer la configuration de la construction et de placer la configuration dans un référentiel ailleurs. Malheureusement, les complexités le rendent un peu ennuyeux, mais je pensais juste que je mettrais à profit les options flexibles de configuration.
adprocas
Quelle est la Filepolitique ici? Quelle est la taille maximale du fichier? Et comment écrit-il dans un fichier? (le fichier contient-il toujours les 10 derniers Mo de journaux?)
Tina J