1.1 Einführung
Es ist peinlich, es zu sagen. Vor kurzem wurde das Unternehmen an das Kundenunternehmen geschickt, um ausgelagerte Entwicklungspositionen ausgelagert zu werden. Ich habe ursprünglich einige verwandte Interviewfragen für Redis, Rabbitmq, SSM Frameworks und einige Projektbewertungen vorbereitet. Ich ging mit Zuversicht zum Interview. Infolgedessen fragte jemand, was das im jüngsten Projekt verwendete Protokollsystem verwendete, sobald ich aufgetaucht bin. Wie ist die Protokollebene konfiguriert? Ich war damals verwirrt. Normalerweise habe ich mich vom Projektmanager darum gekümmert. Ich habe gerade das Internet durchsucht und es eingefügt und es war in Ordnung. Nachdem ich mit dem Sprechen fertig war, sah mir der Interviewer einen tiefen Blick an. Zu dieser Zeit schämte ich mich ...
1.2 Erzählen Sie mir weniger über Klatsch und erzählen Sie mir die Geschichte der Entwicklung des Protokolls (wenn Sie bereits wissen, können Sie es überspringen und sich einfach die 1.3 -Protokollkonfiguration ansehen)
Um ein detailliertes Verständnis der Implementierung der Protokolltechnologie zu haben, empfehle ich persönlich zu lesen: Logback + SLF4J. Bei der Protokollkonfiguration ist es besser, Log4J zu verstehen, da die meisten Projekte derzeit Log4J verwenden. Okay, beginnen wir mit der Entwicklungsgeschichte des Protokolls:
1999 veröffentlichte die Apache Open Source Community Log4J, was in der gesamten Programmwelt eine Sensation verursachte. Seitdem ist es zum Standard für die Protokollierung geworden und wurde von Java -Programmierern weit verbreitet. Später veröffentlichte Sun auch den Protokollierungsmechanismus (Java.util.logging, im Folgenden als Jul) in der JDK -Version 1.4, aber der Mechanismus wurde von der Öffentlichkeit nicht anerkannt, was wirklich erbärmlich ist. Bald hat Apache das Commons-Logging-Protokoll-Framework auf den Markt gebracht (mit dem Entwickler abstrakte Protokoll-Implementierungsmethoden ohne Aufmerksamkeit darauf achten, welche Protokolltechnologie verwendet wird. In Layman-Begriffen möchten Sie Didi auf Ihrem Mobiltelefon anrufen. Wenn Sie in Peking in Peking sind, rufen Sie Didi von Peking an und rufen Sie Didi von Hong an an, und Sie werden von Hong Kong anrufen). Dieser Rahmen scheint eine Verachtung für die Sonne zu sein. Es kann die Protokolltechnologie automatisch in der aktuellen Umgebung für die Protokollausgabe finden und aufrufen. Das Protokoll -Framework kann log4j oder Jul unterstützen. Commons-Logging+Log4j wurde lange danach eine klassische Kombination von Java-Protokollen. Die Commons-Logging wurde jedoch seit einiger Zeit nicht aktualisiert. Ich frage mich, ob das Design von Commons-Logging nicht gut genug war und es schwieriger ist, es zu optimieren. Warum sagst du das? Da der nächste exzellente Protokollierungsgerüst SLF4J geboren wurde, ist der Autor (Ceki Gülcü) einer der Autoren von LOG4J. Sein SLF4J ist eleganter im Design und implementierte auch die Logback-Technologie, die auch hochmoderner ist als log4j. Zu diesem Zeitpunkt hat die Situation, in der das Protokollsystem von Commons-Logging+Log4j dominiert wird, und verschiedene Commons-Logging+Log4j? slf4j+log4j? SLF4J+Logback? Die Kombination ist wirklich herzzerreißend. Noch erschreckender ist, dass Ceki Gülcü -Chef bei der Optimierung von Log4J half, und seitdem gab es eine weitere Protokollierungstechnologie in der Welt - Log4J2. Wird dies von Tencent lernen, Wechat und QQ zu machen? Es ist wirklich 666. Wenn Sie also ein tiefes Verständnis der Protokollierungstechnologie haben möchten, finden Sie relevante Informationen zu Logback + SLF4J. In der Konfigurationsdatei können Sie nur die detaillierte Erläuterung der im Folgenden geschriebenen log4j -Konfiguration verstehen. Immerhin verwenden viele Unternehmen jetzt das Log4J -Framework.
1.3 Gehen Sie zum Thema, grundlegende Protokollkonfiguration
1. Erstellen Sie eine neue log4j.properties -Datei unter dem ClassPath- oder Ressourcenpaket (Maven -Projekt). Die folgenden Parameter reichen für die anfängliche Projektkonfiguration aus. Für eine detailliertere Konfiguration,
Sehen Sie die Konfiguration von 1,4 log4J-Protokollebene fort.
#Spezifizieren Sie die Protokollebene und die Ausgabequelle über den Root -Logger#Die Priorität der Protokollausgabe: Debugg <Info <Warn <Fehler <Fatal#Definieren Sie die Protokollebene (Info) des Stammloggers und die Alias der Ausgangsquelle (Konsole, MyFile) #Dis Definition des Protokolls in der Konsex- und Datei, und nur Ausgabeprotokoll. Implementierung der Ausgangsquellenkonsole als Konsolenausgabe ##########Die durch den Stammlogger definierte Ausgabequelle definieren. Die Implementierungsklasse ist ConsolesAppender (Konsolenausgangsquelle) log4j.appender.console log4j.appender.console.layout = org.apache.log4j.patternLayout#Definieren Sie das spezifische Format von log Output Log4j.appender.console.layout.ConversionPattern =%d%-5p [%c.%m ()] -%n ##################################################################################################### zu erhaltenzem. Ausgabequelle alias MyFile (dh die vom Stammlogger definierte Ausgabequelle)#Die Implementierungsklasse ist rollingFileAppender (Dateiausgabequelle) log4j.appender.myfile = org.apache.log4j.rollingFileAppender#Define den Speicherpfad der Log4j.myFile.myFile.file = Src/log4j.myFile. Größe der Protokolldatei log4j.appender.myFile.m AxFileSize = 1024KB#Definieren Sie ein Maximum mehrerer Protokolldateien (Berechnen Sie 1 aus 0, dh bis zu 3 Dateien hier) #abSent Diese Größe wird vor dem Vorbild von überschriebener Datei überschrieben. log4j.appender.myFile.layout = org.apache.log4j.patternLayout#Definieren Sie das spezifische Format von Log Output Log4j.Appender.console.Layout.ConversionPattern =%d%-5p [%c.%m () -%M%N ########################################################################illstoffstoffstoffstoffstoffstoffstoffIstoffstoffstoffstoffstoffstoffstoffIstoffstoffstoffstoffstoffstoffIstoffstoffstoffstoffstoffstoffIstoffstoffstoffstoffstoffstoffIstoffstoffstoffstoffstoffstoffstoffIstoffstoffstoffstoffstoffstoffstoffstoffIstoffstoffstoffstoffstoffstoffstoffIstoffstoffstoffstoffstoffstoffstoffstoff. Das Standardformat ist ISO8601 und das Format kann ebenfalls angegeben werden. #Definition lautet wie folgt:%d {yyy Jahr mm Monat DD Tag HH Hour MM Minute SS Sekunden SSS} und die Ausgabe lautet: #Januar 6., 2018 14: 47: 45: 590 #%p: Ausgangsprotokolllevel, das ist, debug, info, warn, fatal, fatal #% #% #%-5p: Das Charakter, das das Charakter ist, ist der Charakter. ist rechts), Sie können daraus erfahren. Ein Beispiel #%C: Der vollständige Name der Klasse, in dem sich das Protokoll befindet.2. Rufen Sie Protokoll auf, um die Konfigurationsergebnisse zu testen.
import org.apache.log4j.logmanager; import org.apache.log4j.logger; import org.apache.log4j.propertyconfigurator; public class logproperstest {public static void-Main log4jpath = system.getProperty ("user.dir")+"// src // log // logProperties // log4j.properties"; PropertyConfigurator.Configure (log4JPath);*/ logger log = logManager.getLogger (logPropertiest.Class); log.debug ("Debugg"); log.info ("Information"); log.warn ("Warnung"); log.Error ("Fehler"); log.fatal ("fataler Fehler"); }}1.4 Konfiguration der Protokollebene
Die Konfiguration der Protokollebene kann in drei Kategorien unterteilt werden. Die obige Konfiguration besteht darin, die Protokollebene des übergeordneten Loggers zu konfigurieren, die zweite Kategorie besteht darin, die Protokollebene des Unterklassen-Protokolls zu konfigurieren, und die dritte Kategorie besteht darin, die Protokollebene der Ausgabequelle (Konsole, Datei usw.) zu konfigurieren. Ihre Priorität auf Protokollebene ist von niedrig bis hoch angeordnet. Es tut mir leid, dass ich die spezifische Aussage nicht klar erklärte. Ich sollte den Fall direkt verstehen können!
1. Wenn die Protokollebene des übergeordneten Loggers (RootLogger) (unter der Annahme, dass es sich um die Info -Ebene handelt), ist die Protokollebene des Unterklassen -Protokolls nicht konfiguriert und die Protokollebene der Ausgabequelle nicht konfiguriert, die Ausgabequelle kann nur eine Info -Ebene oder höher ausgeben.
2. Wenn die Protokollebene des übergeordneten Loggers (RootLogger) (unter der Annahme, dass es sich um eine Info-Ebene handelt), die Protokollebene des Unterklassen-Protokollgers (vorausgesetzt, es ist eine Debug-Ebene) und die Protokollebene der Ausgabequelle nicht konfiguriert, liegt die Ausgangsquellenausgabe über der Debug-Ebene.
A.
4. Wenn die Protokollebene des übergeordneten Protokolls (RootLogger) (unter der Annahme, dass es sich um die Info -Ebene handelt), ist die Protokollebene des Unterklasse -Protokolls nicht konfiguriert und die Protokollebene des Subklass -Loggers ist konfiguriert.
Die Protokollstufe der Ausgabequelle (unter der Annahme, dass es sich um die Debug -Ebene handelt), dann gibt die Ausgabehörde eine Info -Ebene oder höher aus.
Aus dem obigen Fall können wir daher wissen, dass es 2 logische Beziehungen zwischen dem Logger und der Ausgangsquellen -Ausgangsprotokollebene gibt:
1. Wenn die Ausgangsquelle die Protokollebene nicht definiert, erbt sie die Log -Ebene, die ihrem Subklass -Protokoll am nächsten liegt. Wenn der Unterklasse -Logger die Protokollebene nicht definiert, erbt er den übergeordneten Logger, der seinem übergeordneten Logger am nächsten liegt.
2. Beim Drucken des Protokolls vergleicht die Ausgabequelle mit der vom Subklass -Logger definierten Protokollebene, die ihm am nächsten liegt. Wenn die von der Ausgangsquelle definierte Ebene höher ist als der Unterklassen -Logger, wird das Protokoll gemäß der von der Ausgangsquelle definierten Protokollebene ausgegeben und umgekehrt.
Daher können Sie im Projekt die Protokollebene gemäß der täglichen Konfigurationsmethode konfigurieren:
#Control Die Protokollebene des übergeordneten Protokolls ist Informationen. Standardmäßig werden nur Protokolle über der Info -Ebene unter allen Modulen log4j.rootlogger = info ausgegeben, Konsole#Konsole#steuern Sie die Protokollebene eines Moduls separat auf Fehler log4j.logger.log.logProperties.LogPropertiesTest=debug##################################################### ############################################################################################################ ########################################################################################################### ############################################################################################################ #Geben Sie die Protokollebene der aktuellen Ausgangsquelle an. With the previous configuration, you do not need to configure this item #log4j.appender.console.Threshold = info#Specify the format of log output: Flexible format log4j.appender.console.layout=org.apache.log4j.PatternLayout #Content of specific format log4j.appender.console.layout.ConversionPattern=%d %-2p [%c.%m ()] -%M%n
1.5 Schlussfolgerung
An diesem Punkt glaube ich, dass Sie ein grundlegendes Verständnis der Protokollkonfiguration haben. Es gibt viele Dinge in dem Artikel, die möglicherweise falsch sein, und alle Helden sind herzlich eingeladen, auf sie hinweisen. Ich habe einen Artikel geschrieben, um ihn zusammenzufassen, um die Konfiguration dieser Technologie tief verstehen zu können, damit ich ein tieferes Verständnis dafür habe.