web-dev-qa-db-de.com

Sehr einfache log4j2 XML-Konfigurationsdatei mit Console und File Appender

Ich hätte gerne eine sehr einfache XML-Konfigurationsdatei mit einer Konsole und einem Dateianhang mit log4j2.

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

205
<?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 (d. H. In Ihrem Quellordner "src").
  • Verwenden Sie Logger logger = LogManager.getLogger();, um Ihren Logger zu initialisieren
  • Ich habe instantFlush = "false" gesetzt, da dies für SSD-Lebensdauer besser ist. Wenn Sie das Protokoll sofort in Ihrer Protokolldatei benötigen, entfernen Sie den Parameter oder setzen Sie ihn auf true
265

Hier ist mein vereinfachtes log4j2.xml, das auf der Konsole gedruckt und in eine tägliche fortlaufende Datei geschrieben wird:

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

interval (integer) - Wie oft ein Rollover basierend auf der spezifischsten Zeiteinheit im Datumsmuster erfolgen soll. Beispiel: Bei einem Datumsmuster mit Stunden als spezifischstem Element und einem Inkrement von 4 Rollovers würde dies alle 4 Stunden erfolgen. Der Standardwert ist 1.

modulate (boolean) - Gibt an, ob das Intervall so angepasst werden soll, dass der nächste Rollover an der Intervallgrenze erfolgt. Wenn es sich bei dem Element beispielsweise um Stunden handelt, die aktuelle Stunde 3 Uhr morgens und das Intervall 4 Uhr ist, erfolgt der erste Rollover um 4 Uhr morgens und der nächste um 8 Uhr morgens, mittags, um 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

Eine neue Protokolldatei wird täglich erstellt. Der vorherige Tag wird automatisch umbenannt in:

cucumber_yyyy-MM-dd.log

In einem Maven-Projekt würden Sie das log4j2.xml im src/main/resources odersrc/test/resources.

18
silver

log4j2 hat ein sehr flexibles Konfigurationssystem (was 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.html als Referenz.

Persönlich habe ich gerade erst begonnen, log4j2 zu verwenden, aber ich tendiere zur "strengen XML" -Konfiguration (d. H. Verwendung von Attributen anstelle von Elementnamen), die schemavalidiert werden kann.

Hier ist mein einfaches Beispiel für die Verwendung der Autokonfiguration und des Strict-Modus unter Verwendung 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>
12
Christof Kälin