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
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"?><Configurationstatus="WARN"><Properties><Propertyname="logPath">target/cucumber-logs</Property><Propertyname="rollingFileName">cucumber</Property></Properties><Appenders><Consolename="console"target="SYSTEM_OUT"><PatternLayoutpattern="[%highlight{%-5level}] %d{DEFAULT} %c{1}.%M() - %msg%n%throwable{short.lineNumber}"/></Console><RollingFilename="rollingFile"fileName="${logPath}/${rollingFileName}.log"filePattern="${logPath}/${rollingFileName}_%d{yyyy-MM-dd}.log"><PatternLayoutpattern="[%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 --><TimeBasedTriggeringPolicyinterval="1"modulate="true"/></Policies></RollingFile></Appenders><Loggers><Rootlevel="DEBUG"additivity="false"><AppenderRefref="console"/><AppenderRefref="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.
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"?><Configurationmonitorinterval="30"status="info"strict="true"><Properties><Propertyname="filename">log/CelsiusConverter.log</Property></Properties><Appenders><Appendertype="Console"name="Console"><Layouttype="PatternLayout"pattern="%d %p [%t] %m%n"/></Appender><Appendertype="Console"name="FLOW"><Layouttype="PatternLayout"pattern="%C{1}.%M %m %ex%n"/></Appender><Appendertype="File"name="File"fileName="${filename}"><Layouttype="PatternLayout"pattern="%d %p %C{1.} [%t] %m%n"/></Appender></Appenders><Loggers><Rootlevel="debug"><AppenderRefref="File"/><AppenderRefref="Console"/><!-- Use FLOW to trace down exact method sending the msg --><!-- <AppenderRef ref="FLOW" /> --></Root></Loggers></Configuration>
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?)
Odpowiedzi:
Uwagi:
Logger logger = LogManager.getLogger();
do inicjalizacji rejestratoraźródło
Oto moja uproszczona funkcja,
log4j2.xml
która drukuje na konsolę i zapisuje do codziennego pliku kroczącego:Wynik:
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.xml
wsrc/main/resources
lubsrc/test/resources
.źródło
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:
źródło
File
zasady tutaj? Jaki jest maksymalny rozmiar pliku? A jak to pisze do pliku? (czy plik zawsze zawiera ostatnie 10 MB dzienników?)