Log4j2 in Tomcat
Ich bin mit Tomcat 6 und versuchen zu wechseln JUL um Log4j2 (2.0 beta 3). Jedoch, wie es ist ganz ein neues Projekt, die Dokumentation ist sehr spärlich und es gibt nicht viele Ressourcen online, noch.
, Was ich will
- Alle Ereignisse, die oben genannten debug-Ebene gehen sollte, um eine Datei auf der Festplatte.
- Fehler gehen sollte, um
syserr
. - Alles an info zu warnen, sollte gehen, um
sysout
. - Markiert audit-logs sollten alle überspringen Sie diese und gehen Sie zu einer anderen Datei auf der Festplatte.
, Was ich versucht habe
Dies ist mein Erster Versuch log4j2.xml
Datei:
Was soll ich schreiben in configuration status
? Wo ist eine Dokumentation über Sie?
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="info">
<appenders>
<Console name="Console-err" target="SYSTEM_ERR">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
<Console name="Console-out" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
<File name="MyFile" fileName="app.log">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</File>
</appenders>
<loggers>
<logger name="com.ecm" level="error" additivity="false">
<appender-ref ref="Console-err" />
<appender-ref ref="MyFile" />
</logger>
<root level="info">
<appender-ref ref="Console-out" />
<appender-ref ref="MyFile" />
</root>
</loggers>
</configuration>
Wie funktioniert der logger-name beziehen sich auf Java-Klassen und Ihre Logger?
Beispiel-code:
package com.ecm.backend;
public final class Foo {
private static final Logger LOG = LogManager.getLogger(Foo.class);
public static void bar() {
LOG.error("this is error");
LOG.warn("this is warning");
}
}
Wenn ich diesen starte, bekomme ich diese in der Konsole und in der log-Datei:
10:22:49.385 [http-8080-3] ERROR com.ecm.backend.Foo - this is error
Warum ist die Warnung ignoriert?
Wenn ich entfernen Sie die additivity="false"
ich bekommen:
10:26:51.388 [http-8080-1] ERROR com.ecm.backend.Foo - this is error
10:26:51.388 [http-8080-1] ERROR com.ecm.backend.Foo - this is error
Die Warnung wird ignoriert, wieder und der Fehler wiederholt sich (wie erwartet).
Was mache ich falsch?
Unter der Falte: rest der Tomcat verwenden können, JULI, ich will nur Log4j2 für meine Anwendung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie die Konfiguration status="debug" Sie werden sehen, eine Menge von log4j2-internen log-Anweisungen über das, was passiert während der Konfiguration. Dies kann nützlich sein, trouble-Shooting-Konfiguration.
Ich in der Regel configuration status="warnen", so dass ich nur benachrichtigt, wenn es ein problem gibt.
Über die Beziehung zwischen logger Namen, Holzfäller und Ihre java-Klasse, vielleicht hilft das:
http://logging.apache.org/log4j/2.x/manual/architecture.html
Über die Frage, warum die Warnung wird ignoriert, es ist dieser logger config:
Gibt es auch einen logger wie diese:
Den logger config "com.ecm" verarbeitet alle Anrufe aus dem PROTOKOLL-logger, sondern nur diejenigen, die auf "Fehler" oder einer höheren Ebene (tödlich) wird eigentlich protokolliert werden. Protokollieren von Ereignissen auf anderen Ebenen (warn, info, debug und trace) werden herausgefiltert, weil Ihr level zu niedrig ist.
Den Weg, die additivität funktioniert, ist, dass zuerst die Namen logger config ("com.ecm" in diesem Fall) entscheidet, ob die Veranstaltung, die herausgefiltert werden soll oder nicht. Dann, wenn der additivität="true" (Standardeinstellung), wird das Ereignis an das übergeordnete logger (in diesem Fall der root-logger).
Da die "warn"-level-event ist bereits herausgefiltert, die von der "com.ecm" logger config-nie erreicht es den root-logger.
Nicht sicher, was Sie versuchen zu erreichen, aber wenn Sie möchten, senden verschiedenen Ebenen Veranstaltung zu verschiedenen appenders, einen Weg, es zu tun, kann es sein, legen Sie Ebenen auf der appender-refs, nicht auf dem Logger:
Dieser sendet die Ausgabe der LOG-logger MyFile und (wenn level error oder fatal) auch auf Konsole-err.
Ausgang vom Logger nicht in der "com.ecm" - Paket gesendet werden, um MyFile und (ist level info, warn, error oder fatal) auch auf Konsole-aus.