Während des Projektbetriebs ist es häufig erforderlich, funktionales Debugging durchzuführen und das Benutzerverhalten zu verfolgen und aufzunehmen. Einige Menschen sind es gewohnt, System zu verwenden. Out, dies wird jedoch nicht empfohlen. Es ist nur einfach zu bedienen, aber nicht einfach zu warten und hat keine Skalierbarkeit. Im Vergleich zu Log4J kann LOG4J das Ziel, das Ausgabeformat und die Ebene der Protokollinformationen usw. steuern, damit wir den Prozess der Protokollgenerierung genauer steuern können.
Log4J2 ist ein Upgrade auf LOG4J1 mit signifikanten Verbesserungen in Bezug auf Leistung und Funktionalität, einschließlich eines verbesserten Durchsatzes in Multithreads, Unterstützung für Platzhalter, automatische Konfigurationsdatei -Nachladen usw.
1. Einführung
1. Laden Sie das JAR -Paket herunter
pox.xml
<dependencies> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.10.0</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version> 2.10.0 </Version> </abhängig> </abhängig>
2. Konfigurationsdatei
Log4J enthält vier Konfigurationsfabrik -Implementierungen: JSON, YAML, Eigenschaften und XML. In diesem Artikel wird die häufig verwendete Methode XML vorgestellt.
Log4J kann sich während der Initialisierung automatisch konfigurieren. Wenn LOG4J gestartet wird, werden alle Namenskonformendateien unter dem Klassenpfad mit Prioritätsreihenfolge angezeigt: log4j2-test.properties> log4j2-test.xml> log4j2.properties> log4j2.xml
3. Ein einfaches Beispiel
XML -Konfiguration:
<?xml version="1.0" encoding="UTF-8"?><Configuration status="WARN"> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </Console> </Appenders> <Loggers> <root Level = "info"> <AppenderRef ref = "console"/> </root> </loggers> </configuration> Java -Code:
private statische endgültige Logger logger = logManager.getLogger (myapp.class); @Test public void testlog4j () {logger.info ("Hallo Welt!"); }}Konsoleninformationen
22: 17: 47.146 [Haupt] Info MyApp - Hallo Welt!
2. Moduleinführung
<Configuration>
| Eigentum | beschreiben |
| MonitorInterval | Wenn die Datei geändert wird, wird die Konfiguration nach der angegebenen Zeit neu geladen. Einheiten von Sekunden, Mindestwert beträgt 5 |
| Pakete | Eine von Kommas getrennte Liste von Paketnamen, die zur Suche nach Plug-Ins verwendet werden, z. B. benutzerdefinierte Filter, Appierer usw. Das Plugin lädt nur einmal, sodass Sie das Projekt neu starten müssen, wenn es nach der Änderung wirksam wird. |
| Status | Die interne Protokollebene, die den Wert auf Debugg festlegt, kann deutlich den gesamten Protokollereignisfluss auf der Konsole sehen. Der verwendete Protokoll ist org.apache.logging.log4j.core.logger |
| strikt | Das strenge XML -Format ist erlaubt. Die JSON -Konfiguration wird nicht unterstützt |
| ausführlich | Aktivieren Sie Diagnoseinformationen beim Laden von Plugin |
<Appenders>
LOG4J ermöglicht Protokollanfragen auf mehrere Ziele. In der Sprache log4j heißt das Ausgabeziel Appender. Derzeit existieren Appender in Konsolen, Dateien, Remote -Socket -Servern, Apache -Flume, JMS, Remote Unix -Syslog -Daemons und verschiedenen Datenbank -APIs. Im Folgenden werden mehrere häufig verwendete Appender eingeführt. Wenn Sie mehr wissen müssen, können Sie es auf der offiziellen Website überprüfen.
1. ConsoleAppender
Ausgabe an Konsole, <konsole>
Parametername | Typ | beschreiben |
Filter | Filter | Filter |
Layout | Layout | Protokollausgabeformat |
Folgen | boolean | |
direkt | boolean | |
Name | Saite | Der Name des Appender |
Ignoreexceptions | boolean | Standardtreu, ignorieren Sie Schreibausnahmen |
Ziel | Saite | System_out oder System_err, Standard ist System_out |
2. FileAppender
Ausgabe zur Datei, <Datei>
Parameter | Typ | beschreiben |
|---|---|---|
anhängen | boolean | Die Standardeinstellung ist wahr, und neue Datensätze werden am Ende der Datei beigefügt |
Bufferedio | boolean | Die Standardeinstellung ist wahr. Die Verwendung von Puffern kann die Leistung erheblich verbessern |
puffern | int | Wenn Bufferedio wahr ist, beträgt die Puffergröße dieser Eigenschaft standardmäßig 8192 Bytes. |
createDemand | boolean | Appender erstellt Dateien auf Bedarf. Der Appender erstellt diese Datei nur, wenn ein Protokollereignis alle Filter übergeht und an den Appender weitergeleitet wird. Der Standardwert ist falsch |
Filter | Filter | Ein Filter, um festzustellen, ob das Ereignis von diesem Appender behandelt werden sollte. Mehrere Filter können mit Verbundfiltern verwendet werden |
Dateiname | Saite | Der Name der zu schriftlichen Datei. Wenn die Datei oder eine seiner übergeordneten Verzeichnisse nicht vorhanden ist, werden sie erstellt |
unmittelbar | boolean | Standardmäßig wird nach jedem Schreiben aktualisiert. Dadurch wird sichergestellt, dass die Daten des Puffer auf die Festplatte geschrieben werden, die Leistung jedoch beeinflussen können. |
Layout | Layout | Protokollformat |
Sperren | boolean | Dateisperrung, Standard falsch |
Name | Saite | Der Name des Appender |
Ignoreexceptions | boolean | Standardtreu, ignorieren Sie Schreibausnahmen |
Filepermissionen | Saite | Dateiberechtigungen definieren Beispiel: rw ------ oder rw-rw-rw- usw. |
Dateieinhaber | Saite | Dateibesitzer definieren |
Dateigruppe | Saite | Dateigruppen definieren |
3. JdbcaAppender
JDBCAppender verwendet Standard -JDBC, um Protokollereignisse in relationale Datenbanktabellen zu schreiben. Es kann so konfiguriert werden, dass eine JDBC -Verbindung mit einer JNDI -Datenquelle oder einer benutzerdefinierten Werksmethode erhalten wird. Unabhängig von der Methode muss es vom Verbindungspool unterstützt werden.
Andernfalls ist die Protokollierungsleistung stark betroffen.
Wenn der konfigurierte JDBC -Treiber Stapelanweisungen unterstützt und die Puffergröße auf eine positive Zahl konfiguriert, wird das Protokollereignis angegriffen.
(1) <Jdbc>
Parameter | Typ | beschreiben |
|---|---|---|
Name | Saite | Muss, Name des Appender |
Ignoreexceptions | boolean | Standardtreu, ignorieren Sie die Ausnahmen von Protokollereignissen |
Filter | Filter | Filter |
puffern | int | Wenn eine Ganzzahl größer als 0 ist, wird der Appender das Protokollereignis puffern und die Schreibdaten aktualisieren, wenn der Puffer diese Größe erreicht |
Connectionsource | Connectionsource | Muss eine Datenbankverbindung abgerufen werden |
Tablauton | Saite | Erforderlich, fügen Sie den Datentabellennamen des Protokollereignisses ein |
Columnconfigs | Columnconfig [] | Muss, Felder, die in die Datenbank eingefügt werden müssen |
ColumnMappings | ColumnMapping [] | Erforderlich, Feldzuordnungskonfiguration |
(2) Verwenden Sie <DataSource>, um die JDBC -Verbindung zu erhalten. Hier ist nur JNDI aufgeführt:
| Parameter | Typ | beschreiben |
|---|---|---|
| Jndiname | Saite | Erforderlich, wenn der konfigurierte JNDI JDBC/LoggingDatabase ist, ist der Wert hier Java: comp/env/jdbc/loggingDatabase. Die Datenquelle muss vom Verbindungspool unterstützt werden. Andernfalls ist die Protokollierung sehr langsam. |
(3) Verwenden Sie <spalte>, um anzugeben, welche Spalten in die Tabelle schreiben und wie Sie sie schreiben. Es hat keine SQL -Injektionsanfälligkeit.
| Parameter | Typ | beschreiben |
|---|---|---|
| Name | Saite | Erforderlich, Tabellenfeldname |
| Muster | Saite | Fügen Sie die Werte mit dem MusterLayout -Modus ein. HINWEIS: Im selben Spaltenelement kann im selben Spaltenelement nur eines der drei Attribute von Muster, wörtlichem und iseventTimestamp vorhanden sein. |
| wörtlich | Saite | Dieser Wert wird direkt in der SQL -Anweisung enthalten und ausgeführt, z. |
| IseventTimestamp | boolean | Ob das Zeitformat java.sql.types.timestamp |
| isunicode | boolean | Diese Eigenschaft wird ignoriert, es sei denn, ein Muster wird angegeben. Wenn wahr, wird der Wert in Unicode eingefügt. Andernfalls wird der Wert in einen Nicht-Unicode eingefügt. |
| Isclob | boolean | Diese Eigenschaft wird ignoriert, es sei denn, ein Muster wird angegeben. Wenn wahr, wird der Wert in den CLOB eingefügt, andernfalls wird der Varchar Nvarchar in die eingefügt in die |
Beispiel:
<? isEventTimestamp="true" /> <Column name="level" pattern="%level" /> <Column name="logger" pattern="%logger" /> <Column name="message" pattern="%message" /> <Column name="exception" pattern="%ex{full}" /> </JDBC> </Appenders> <Loggers> <Root level="warn"> <AppenderRef Ref = "DatabaseAppender"/> </root> </loggers> </configuration><MusterLayout>
(1) Datum, %d/ %Datum
Muster | Beispiel |
|---|---|
%d {Standard} | 2012-11-02 14: 34: 02.781 |
%d {ISO8601} | 2012-11-02t14: 34: 02.781 |
%d {ISO8601_Basic} | 20121102T143402,781 |
%d {absolut} | 14: 34: 02.781 |
%d {Datum} | 02. November 2012 14: 34: 02,781 |
%d {Compact} | 20121102143402781 |
%d {hh: mm: ss, ss} | 14: 34: 02.781 |
%d {dd mmm yyy hh: mm: ss, ss} | 02. November 2012 14: 34: 02,781 |
%d {hh: mm: ss} {gmt+0} | 18:34:02 |
%d {unix} | 1351866842 |
%d {unix_millis} | 1351866842781 |
Natürlich können Sie das Format auch anpassen, z.
(2) Logger, %C/ %Logger
Konversionsmuster | Logger -Name | Ergebnis |
|---|---|---|
%c {1} | org.apache.commons.foo | Foo |
%c {2} | org.apache.commons.foo | commons.foo |
%c {10} | org.apache.commons.foo | org.apache.commons.foo |
%c {-1} | org.apache.commons.foo | apache.commons.foo |
%c {-2} | org.apache.commons.foo | commons.foo |
%c {-10} | org.apache.commons.foo | org.apache.commons.foo |
%c {1.} | org.apache.commons.foo | OACFOO |
%c {1.1. ~. ~} | org.apache.commons.test.foo | oa ~. ~ .foo |
%C{.} | org.apache.commons.test.foo | .... foo |
{?} - Wann ? ist eine positive Ganzzahl, es bedeutet, dass N -Teile von rechts genommen werden und eine negative Ganzzahl bedeutet, dass N -Teile von links entfernt werden. Also, warum %c {-10} der vollständige Name ist, weiß ich nicht. Willkommen, um eine Nachricht zu hinterlassen
(3) Protokollinformationen,%M/%MSG/%Message
(4) Protokollebene, %Niveau
<Filter>
Log4J2 verfügt über eine Vielzahl von Filtern für die direkte Verwendung, und wir können auch Filter selbst definieren:
Myfilter.java
import org.apache.logging.log4j.level; import org.apache.logging.log4j.marker; import org.apache.logging.log4j.threadcontext; import org.apache.logging.log4j.core.logent; org.apache.logging.log4j.core.config.plugins.import org.apache.logging.log4j.core.config.plugins.pluginFactory; import org.apache.logging.log4j.core.filter.abstractFilter; importieren; org.apache.logging.log4j.message.message; @Plugin (name = "myfilter", category = "core", elementtype = "filter", printObject = true) öffentliche endgültige Klasse Myfilter erweitert AbstractFilter {private endgültige Ebene; Private MyFilter (Level Level, Ergebnis OnMatch, Ergebnisse OnMisMatch) {Super (OnMatch, OnMisMatch); this.level = Level; } öffentlicher Ergebnisfilter (Logger -Logger, Ebene der Ebene, Markierungsmarker, String -MSG, Objekt [] Params) {Rückgabefilter (Ebene); } öffentlicher Ergebnisfilter (Logger -Logger, Level Level, Markermarker, Objekt -MSG, Throwable T) {Rückgabefilter (Ebene); } öffentlicher Ergebnisfilter (Logger -Logger, Level Level, Markermarker, Message MSG, Throwable T) {Rückgabefilter (Ebene); } @Override public Ergebnisfilter (loGEvent event) {return filter (event.getLevel ()); } privater Ergebnisfilter (Ebene) { / * * Geschäftslogik * * / return Level.ismorespecificThan (this.level)? OnMatch: OnMisMatch; } @Override public String toString () {return Level.toString (); } @PluginFactory public static MyFilter createFilter (@PluginAttribute (value = "Level, DefaultString =" Fehler ") Level Level, @PluginAttribute (value =" onmatch ", defaultString =" neutral ") Ergebnis OnMatch, @Pluginattribute (Value =", DefaultString = "DenyTribute (Value). Myfilter (Level, OnMatch, OnMisMatch); }}log4j2.xml
<?xml version="1.0" encoding="UTF-8"?><Configuration status="warn" monitorInterval="5" packages="your packages" verbose="false" strict="true"> <Appenders> <Console name="Console" target="SYSTEM_OUT" ignoreExceptions="true"> <PatternLayout pattern="%d{yyyy-MM-dd HH: MM: SS} %Level %Logger {10} - %msg "/> <myfilter Level =" info "onmatch =" Akzeptieren "/> </console> </Appenders> <logggers> <root Level =" Info "> <Appenderref Ref =" Console "/> </root> </loggers> </configuration> </konfigurierenWieder auffüllen:
In praktischen Anwendungen ist es manchmal erforderlich, Benutzerzugriffsinformationen wie Anforderungsparameter, Benutzer -ID usw. aufzuzeichnen. In Log4J1 verwenden wir MDC und NDC, um die Anwendungskontextinformationen zu speichern, während Log4J2 ThreadContext verwendet, um die Funktionen von MDC und NDC zu implementieren.
(1) NDC verwendet einen stapelähnlichen Mechanismus, um Kontextinformationen zu speichern, und Threads sind unabhängig.
Verwenden Sie %X, um in MusterLayout auszugeben. Beachten Sie, dass x Kleinbuchstaben ist.
Beispiel:
Test.java
ThreadContext.push ("Hallo Welt!");log4j2.xml
<Spaltenname = "Tipp" muster = "%x" />
(2) MDC verwendet einen kartenähnlichen Mechanismus, um Informationen zu speichern, und Threads sind unabhängig.
Verwenden Sie %x {userID} in musterlayout, um auszugeben, beachten Sie, dass X aktiviert ist.
Beispiel:
Test.java
ThreadContext.put ("userId", "1");log4j2.xml
<Spaltenname = "userID" muster = "%x {userId}" />Beachten Sie, dass nach der Verwendung Clearall () die Kontextkarte und Stapel löschen.
API: http://logging.apache.org/log4j/2.x/javadoc.html
Offizielle Website -Adresse: https://logging.apache.org/log4j/2.x/index.html
Der obige Beispielcode der Log4J2 -Projektprotokomponente ist der gesamte Inhalt, den ich mit Ihnen teile. Ich hoffe, Sie können Ihnen eine Referenz geben und ich hoffe, Sie können wulin.com mehr unterstützen.