Bardzo prosty plik konfiguracyjny XML log4j2 przy użyciu konsoli i programu dołączającego pliki

223

Chciałbym bardzo prosty plik konfiguracyjny XML z konsolą i programem dołączającym pliki używającym log4j2.

(Witryna Apache zabija mnie wieloma informacjami).

Thorsten Niehues
źródło
72
Haha - tak się cieszę, że powiedziałeś to „(Witryna Apache zabija mnie dużą ilością informacji.”)
Thonnor,
19
To twoje zdanie (strona Apache zabija mnie dużą ilością informacji.) Jest głównym powodem, dla którego przeglądam twoje pytanie!
Ju Oliveira,

Odpowiedzi:

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>

Uwagi:

  • Umieść następującą treść w pliku konfiguracyjnym.
  • Nazwij plik konfiguracyjny log4j2.xml
  • Umieść plik log4j2.xml w folderze znajdującym się na ścieżce klasy (tj. W folderze źródłowym „src”)
  • Posługiwać się Logger logger = LogManager.getLogger(); do inicjalizacji rejestratora
  • Ustawiłem parametr instantFlush = "false", ponieważ jest to lepsze na czas życia dysku SSD . Jeśli potrzebujesz dziennika od razu w pliku dziennika, usuń parametr lub ustaw go na true
Thorsten Niehues
źródło
1
Dla kompletności szczególnie zalecane jest użycie natychmiastowegoFlush = "false" przy korzystaniu z Async Logger lub AsyncAppender.
Remko Popma,
1
Tło: natychmiastoweFlush = "fałsz" pozwala komponentom asynchronicznym Log4J2 grupować wiele zdarzeń dziennika w zapis na jednym dysku. Jako bonus, ostatnie zdarzenia w dzienniku są zawsze zapisywane na dysku i nigdy nie pozostają zawieszone w buforze pamięci. (Coś, co denerwowało mnie w log4j-1.2.)
Remko Popma,
1
Nie udało mi się uruchomić przykładów na stronie Log4j 2.0, ale ten zadziałał. Dziękuję Ci.
djangofan
12
Należy dodać, że to czyste mogą być wymagane dla tych, którzy używają zaćmienie. Ze względu na ludzkość.
Reut Sharabani,
1
@ThorstenNiehues Nie mogę edytować mojego poprzedniego komentarza, ale środowisko Eclipse kopiuje konfigurację podczas kompilacji iz jakiegoś powodu nie zawsze kopiuje plik log4j.xml, nawet jeśli się zmienił. Przynajmniej to mnie rozwiązało.
Reut Sharabani,
19

Oto moja uproszczona funkcja, log4j2.xmlktóra drukuje na konsolę i zapisuje do codziennego pliku kroczącego:

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

interwał (liczba całkowita) - jak często powinno występować najazd na podstawie najbardziej określonej jednostki czasu we wzorcu daty. Na przykład z wzorcem daty z godzinami jako najbardziej konkretnym przedmiotem i przyrostem 4 najazdów pojawiałby się co 4 godziny. Wartość domyślna to 1.

modulate (boolean) - Wskazuje, czy interwał powinien zostać dostosowany, aby spowodować wystąpienie następnego najazdu na granicy interwału. Na przykład, jeśli pozycja to godziny, bieżąca godzina to 3 nad ranem, a interwał to 4, wtedy pierwsze rollover nastąpi o 4 rano, a następne następują o 8 rano, w południe, 16:00 itd.

Źródło: https://logging.apache.org/log4j/2.x/manual/appenders.html

Wynik:

[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

Nowy plik dziennika zostanie utworzony codziennie, a nazwa poprzedniego dnia zostanie automatycznie zmieniona na:

cucumber_yyyy-MM-dd.log

W projekcie Maven umieściłbyś log4j2.xmlw src/main/resources lub src/test/resources .

srebro
źródło
12

log4j2 ma bardzo elastyczny system konfiguracji (który IMHO bardziej rozprasza niż pomoc), możesz nawet użyć JSON. Zobacz https://logging.apache.org/log4j/2.x/manual/configuration.html w celach informacyjnych.

Osobiście niedawno zacząłem używać log4j2, ale dążę do konfiguracji „ścisłego XML” (to znaczy używając atrybutów zamiast nazw elementów), które można zweryfikować pod kątem schematu.

Oto mój prosty przykład z użyciem autokonfiguracji i trybu ścisłego, z użyciem „Właściwości” do ustawienia nazwy pliku:

<?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
źródło
Elastyczna konfiguracja przydaje się, gdy próbujesz oddzielić konfigurację od kompilacji i umieścić konfigurację w repozytorium w innym miejscu. Niestety złożoność sprawia, że ​​jest to trochę denerwujące, ale pomyślałem, że skorzystam z elastycznych opcji konfiguracji.
adprocas,
Jakie są Filezasady tutaj? Jaki jest maksymalny rozmiar pliku? A jak to pisze do pliku? (czy plik zawsze zawiera ostatnie 10 MB dzienników?)
Tina J