File di configurazione XML log4j2 molto semplice utilizzando Console e File appender


223

Vorrei un file di configurazione XML molto semplice con una console e un appender di file usando log4j2.

(Il sito Web Apache mi sta uccidendo con molte informazioni.)


72
Haha - così felice che tu abbia detto questo "(Il sito Web Apache mi sta uccidendo con molte informazioni.)"
thonnor

19
Quella tua frase (il sito Web Apache mi sta uccidendo con molte informazioni) è il motivo principale per cui sto visualizzando la tua domanda!
Ju Oliveira,

Risposte:


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>

Appunti:

  • Inserisci il seguente contenuto nel tuo file di configurazione.
  • Denominare il file di configurazione log4j2.xml
  • Inserisci log4j2.xml in una cartella che si trova nel percorso di classe (ovvero la cartella di origine "src")
  • Utilizzare Logger logger = LogManager.getLogger();per inizializzare il logger
  • Ho impostato immediateFlush = "false" poiché è meglio per la durata di SSD . Se è necessario il registro immediatamente nel file di registro, rimuovere il parametro o impostarlo su true

1
Per completezza, l'uso di immediateFlush = "false" è particolarmente consigliato quando si utilizzano Async Logger o AsyncAppender.
Remko Popma,

1
Background: immediateFlush = "false" consente ai componenti asincroni di Log4J2 di raggruppare più eventi di registro in una scrittura su disco singolo. Come bonus, i tuoi eventi di registro più recenti vengono sempre scritti su disco e non vengono mai sospesi in un buffer di memoria. (Qualcosa che ho trovato fastidioso su log4j-1.2.)
Remko Popma,

1
Non riuscivo a far funzionare gli esempi sul sito Log4j 2.0, ma questo ha funzionato. Grazie.
Djangofan,

12
Si prega di aggiungere il fatto che potrebbe essere necessario un clean per coloro che usano eclissi. Per il bene dell'umanità.
Reut Sharabani,

1
@ThorstenNiehues Non riesco a modificare il mio commento precedente, ma eclipse copia la configurazione durante la compilazione e, per qualche motivo, non sempre copia log4j.xml anche se è cambiato. Almeno questo è ciò che ha risolto per me.
Reut Sharabani,

19

Ecco il mio semplicistico log4j2.xmlche stampa su console e scrive su un file rolling giornaliero:

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

intervallo (numero intero) : la frequenza con cui deve verificarsi un rollover in base all'unità di tempo più specifica nel modello di data. Ad esempio, con un modello di data con le ore come l'elemento più specifico e l'incremento di 4 rollover si verificherebbe ogni 4 ore. Il valore predefinito è 1.

modulate (boolean) - Indica se l'intervallo deve essere regolato in modo che si verifichi il passaggio successivo al limite dell'intervallo. Ad esempio, se l'elemento è ore, l'ora corrente è 3 e l'intervallo è 4, quindi il primo rollover avverrà alle 4 del mattino e poi i successivi avverranno alle 8, mezzogiorno, 16:00, ecc.

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

Produzione:

[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 nuovo file di registro verrà creato ogni giorno con il giorno precedente rinominato automaticamente in:

cucumber_yyyy-MM-dd.log

In un progetto Maven, si dovrebbe mettere la log4j2.xmlin src/main/resources o src/test/resources .


12

log4j2 ha un sistema di configurazione molto flessibile (che IMHO è più una distrazione che un aiuto), puoi persino usare JSON. Vedi https://logging.apache.org/log4j/2.x/manual/configuration.html per un riferimento.

Personalmente, ho appena iniziato a utilizzare log4j2, ma mi sto orientando verso la configurazione "XML rigoroso" (ovvero, utilizzando attributi anziché nomi di elementi), che può essere convalidato dallo schema.

Ecco il mio semplice esempio usando autoconfigurazione e modalità rigorosa, usando una "Proprietà" per impostare il nome file:

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

La configurazione flessibile è utile quando si sta tentando di separare la configurazione dalla build e inserirla in un repository altrove. Sfortunatamente, le complessità lo stanno rendendo un po 'fastidioso, ma ho pensato di buttare un vantaggio sulle opzioni flessibili per la configurazione.
adprocas,

Qual è la Filepolitica qui? Qual è la dimensione massima del file? E come scrive nel file? (il file contiene sempre gli ultimi 10 MB di log?)
Tina J
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.