Sehr einfache log4j2 XML-Konfigurationsdatei mit Konsole und Datei-Appender


223

Ich möchte eine sehr einfache XML-Konfigurationsdatei mit einer Konsole und einem Dateianhänger unter Verwendung von log4j2.

(Die Apache-Website bringt mich mit vielen Informationen um.)


72
Haha - so froh, dass Sie dies gesagt haben "(Die Apache-Website
bringt

19
Ihr Satz (Die Apache-Website bringt mich mit vielen Informationen um.) Ist der Hauptgrund, warum ich Ihre Frage betrachte!
Ju Oliveira

Antworten:


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>

Anmerkungen:

  • Fügen Sie den folgenden Inhalt in Ihre Konfigurationsdatei ein.
  • Nennen Sie die Konfigurationsdatei log4j2.xml
  • Legen Sie die Datei log4j2.xml in einem Ordner ab, der sich im Klassenpfad befindet (dh in Ihrem Quellordner "src").
  • Verwenden Logger logger = LogManager.getLogger();Sie diese Option, um Ihren Logger zu initialisieren
  • Ich habe sofortFlush = "false" gesetzt, da dies für die Lebensdauer der SSD besser ist . Wenn Sie das Protokoll sofort in Ihrer Protokolldatei benötigen, entfernen Sie den Parameter oder setzen Sie ihn auf true

1
Der Vollständigkeit halber wird die Verwendung von instantFlush = "false" besonders empfohlen, wenn Async Loggers oder AsyncAppender verwendet werden.
Remko Popma

1
Hintergrund: instantFlush = "false" ermöglicht es den asynchronen Komponenten von Log4J2, mehrere Protokollereignisse in einem einzigen Disc-Schreibvorgang zusammenzufassen. Als Bonus werden Ihre letzten Protokollereignisse immer auf die Festplatte geschrieben und nie in einem Speicherpuffer hängen gelassen. (Etwas, das ich an log4j-1.2 ärgerlich fand.)
Remko Popma

1
Ich konnte die Beispiele auf der Log4j 2.0-Site nicht zum Laufen bringen, aber dieses tat es. Danke dir.
Djangofan

12
Bitte fügen Sie die Tatsache hinzu, dass für diejenigen, die Eclipse verwenden, möglicherweise eine Reinigung erforderlich ist. Um der Menschheit willen.
Reut Sharabani

1
@ThorstenNiehues Ich kann meinen vorherigen Kommentar nicht bearbeiten, aber Eclipse kopiert die Konfiguration beim Erstellen und aus irgendeinem Grund wird die Datei log4j.xml nicht immer kopiert, selbst wenn sie geändert wurde. Zumindest hat das das für mich gelöst.
Reut Sharabani

19

Hier ist meine Vereinfachung log4j2.xml, die auf der Konsole druckt und in eine tägliche fortlaufende Datei schreibt:

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

Intervall (Ganzzahl) - Wie oft ein Rollover basierend auf der spezifischsten Zeiteinheit im Datumsmuster erfolgen soll. Beispielsweise würde bei einem Datumsmuster mit Stunden als spezifischstem Element und einem Inkrement von 4 Rollovers alle 4 Stunden auftreten. Der Standardwert ist 1.

modulieren (boolesch) - Gibt an, ob das Intervall angepasst werden soll, damit der nächste Rollover an der Intervallgrenze auftritt. Wenn der Artikel beispielsweise Stunden ist, die aktuelle Stunde 3 Uhr morgens und das Intervall 4 ist, erfolgt der erste Rollover um 4 Uhr morgens und die nächsten um 8 Uhr morgens, 12 Uhr mittags, 16 Uhr usw.

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

Ausgabe:

[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

Täglich wird eine neue Protokolldatei erstellt, wobei der vorherige Tag automatisch in Folgendes umbenannt wird:

cucumber_yyyy-MM-dd.log

In einem Maven-Projekt würden Sie das log4j2.xmlin src/main/resources oder einfügen src/test/resources.


12

log4j2 verfügt über ein sehr flexibles Konfigurationssystem (das meiner Meinung nach eher eine Ablenkung als eine Hilfe ist). Sie können sogar JSON verwenden. Siehe https://logging.apache.org/log4j/2.x/manual/configuration.htmlEine Referenz finden .

Persönlich habe ich erst kürzlich angefangen, log4j2 zu verwenden, aber ich tendiere zur "strengen XML" -Konfiguration (dh zur Verwendung von Attributen anstelle von Elementnamen), die schemavalidiert werden kann.

Hier ist mein einfaches Beispiel für die automatische Konfiguration und den strengen Modus mit einer "Eigenschaft" zum Festlegen des Dateinamens:

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

Die flexible Konfiguration ist praktisch, wenn Sie versuchen, die Konfiguration von der Erstellung zu trennen und die Konfiguration an anderer Stelle in einem Repository abzulegen. Leider macht die Komplexität es etwas nervig, aber ich dachte nur, ich würde den flexiblen Konfigurationsoptionen einen Vorteil verschaffen.
Adprocas

Was ist die FilePolitik hier? Was ist die maximale Dateigröße? Und wie schreibt es in eine Datei? (Enthält die Datei immer die letzten 10 MB Protokolle?)
Tina J
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.