Vorwort
Wenn die Projektgröße immer größer wird, werden neue Module kontinuierlich eingeführt. Verschiedene Module drucken ihre eigenen Protokolle, was schließlich dazu führt, dass das Protokoll nicht angezeigt werden kann. Zum Beispiel gibt es in meinem eigenen Projekt die folgenden Protokolle:
Unter ihnen ist die Menge an Protokolldaten des Nachrichtenprotokolls und des Hintergrund -Threads sehr groß. Wenn alle Protokolle in einer Datei und in einer Datei von tail -f log.log -Datei gedruckt werden, werden Sie feststellen, dass die Protokolle schnell scrollen und nicht ein bestimmtes SQL- oder Service -Zugriffsprotokoll anzeigen oder sogar suchen können.
Die Lösung besteht darin, verschiedene Protokolle zu klassifizieren und auszugeben, damit sich die gegenseitigen Protokolle nicht gegenseitig beeinflussen. Der Zugriff auf Protokolle von besonders wichtigen Schnittstellen kann Probleme leicht aufweisen und beheben.
Schritt 1: Konfigurieren Sie in log4j.properties
Erstens veröffentlichen Sie alle meine eigenen log4j.properties -Konfigurationen:
log4j.rootlogger = info, console, file log4j.appender.console = net.czt.log.asyncconSeAppenderLog4j.Appender.console.layout = org.apache.log4j.patternLayoutlog4j.appender.console.layout.conversionSpather. %-17c {2} (%13f:%l)%x {user_id} |%x {user_ip} |%x {server_address} |%x {server_name} |%x {request_uri} |%x {session_id} - %M %NLOG4J.Appender.Console.BufferSize = 10000Log4J.Appender.Console.encoding = UTF-8 log4j.appender.file = org.apache.log4j.rollingFileAppenderLog4j.appender.File.File =/home/work/apache-tomcat-6.0.39/logs/crazyant.Loglog4j.appender.File.maxb ackupindex = 5Log4j.appender.file.maxFileSize = 1Gblog4J.Appender.File.Layout = org.apache.log4j.patternLayoutlog4j.appender.file.layout.ConversionSpattern = [%-5p] Crazyant-Web%d {yyyy-mm-dd hh: mm: ss, sss}%x {user_id} |%x {user_ip} |%x {server_address} |%x {server_name} |%x {request_uri} |%x {Session_ID}}} Methode:%l%n%M%Nlog4J.Appender.File.Buffersize = 10000Log4j.Appender.File.Engoding = UTF-8 log4j.logger.net.czt.crazyant.msg = Debug, Debug, messagelog4j.additivity.net.czt.crazyant.msg = falselog4j.appender.message = org.apache.log4j.rollingFileAppenderLog4j.appender.message.file Age.Append = Truelog4J.Appender.Message.MaxFileSize = 1Gblog4J.Appender.Message.MaxbackupIndex = 5Log4j.Appender.Message.Layout = org.apache.log4j.patternLayoutlog4j.appender.Message.message.layout.Layout.Layout.Layout.Layout.Layout.Layout.Layout.Layout.Layout.Layout.Layout.message.Layout.LAYOUT.LAYUT.LAYOUT.LAYOUT.LAYOUT.LAYOUT.LAYOUT.LAYOUT.LAYOUT.LAYOUT HH: MM: SS} [%-5p] [%C {1}] [%t]-%M%NLOG4J.Appender.Message.Coding = Utf-8 log4j.logger.net.NET.CZT.CRAZYANT.Async.Service = Debugg, Debug, Debug, Debug, asyncLog4j.additivity.net.czt.crazyant.async.service = falselog4j.appender.async = org.apache.log4j.rollingFileAppenderLog4j.appender.async.file = home/apache-tomcat-6.0.39/logs/crazy_async.0.0.39/logs/crazy_async r.async.Append=truelog4j.appender.async.MaxFileSize=1GBlog4j.appender.async.MaxBackupIndex=5log4j.appender.async.layout=org.apache.log4j.PatternLayoutlog4j.appender.async.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%-5p][%c{1}] [%t] - %m%nlog4j.appender.async.encoding=UTF-8 log4j.logger.net.czt.orm.mybatis.SqlMonitorManager=DEBUG, shosqLlog4j.additivity.net.czt.orm.mybatis.sqlmonitormanager = falselog4j.logger.net.czt.transaction.interceptor.smarttransactionInterceptor = Debug, Debug, showsqllog4j.additivity.net.czt.transaction.interceptor.SmartTransactionInterceptor=falselog4j.appender.showsql=org.apache.log4j.RollingFileAppenderlog4j.appender.showsql.File=/home/work/apache-tomcat-6.0.39/logs/crazyant_sql.logl og4j.appender.showsql.append = truelog4j.appender.showsql.maxFileSize = 1gblog4j.appender.showsql.maxbackupindex = 5Log4j .Appender.showsql.layout = org.apache.log4j.patternLayoutLog4j.appender.showsql.Layout.ConversionPattern =%d {yyyy-mm-dd HH: MM: SS} [%-5p] [%C {1}] [%t]-%M%Nlog4j.Appender.Showsql.Coding = Utf-8 log4j.logger.net.czt.crazyant.Service = Debug, Debug, servicelog4j.additivity.net.czt.crazyant.service = falselog4j.appender.service = org.apache.log4j.rollingFileAppenderLog4j.appender.service.file rvice.append = truelog4j.appender.service.maxFileSize = 1Gblog4J.Appender.Service.Maxbackupindex = 5Log4J.Appender.Service.Layout = org.apache.log4j.patternLayoutlog4j.Appender.Service HH: MM: SS} [%-5p] [%C {1}] [%t]-%M%NLOG4J.Appender.Service.Enoding = UTF-8Unterhalb der Konfigurationsdatei können Sie leicht feststellen, dass ich Meldung (Meldung), Async (Backend -Thread), zeigtQL (Datenbankprotokoll) und Service (Schnittstellenaufruf) zu verschiedenen Protokolldateien an.
Einige dieser Erklärungen:
log4j.rootLogger=INFO, console, file
Log4J hat das Konzept von RootLogger und gewöhnlichem Logger. Standardmäßig benötigen wir nur einen RootLogger, dh alle Protokolle werden nur für diese Protokolldatei ausgegeben.
Schauen Sie sich die Konfiguration eines normalen Loggers an (nehmen Sie den Schnittstellenprotokolldienst als Beispiel an):
1. log4j.logger.net.czt.crazyant.service=DEBUG, service
Das " net.czt.crazyant.service " in diesem Satz gibt den vollständigen Pfad des Pakets an, der in der normalen Logger -Protokollkonfiguration wirksam wird
Der Farbdienst gibt den Namen des gewöhnlichen Loggers an
2. log4j.additivity.net.czt.crazyant.service=false
Das " net.czt.crazyant.service " in IT entspricht dem oben genannten, was das durch das Konfigurationselement abzielte Paket anzeigt.
Die Bedeutung der Konfiguration in diesem Satz ist, dass das Protokoll des Pakets nicht in das RootLogger -Protokoll ausgegeben wird, sondern nur das von Ihnen konfigurierte Protokoll ausgibt.
A. log4j.appender.service=org.apache.log4j.RollingFileAppender und die Konfigurationselemente unterhalb dieses Konfigurationsabschnitts
Die "Service" -Sziel hier entspricht dem "Service" des ersten Konfigurationselements oben, was die Konfiguration des gewöhnlichen Loggers angibt.
Die folgenden Konfigurationselemente sind mit RootLogger übereinstimmt, wobei die Ausgabedatei täglich angezeigt wird, UTF8, Sharding -Regeln, Ausgabemodus für jede Zeile usw. codieren.
Das Problem, auf das ich gestoßen war, war, dass ich nach der Konfiguration log4j.properties festgestellt hatte, dass jede Protokolldatei erstellt wurde, aber es keinen Inhalt darin enthielt. Warum ist das? Schauen wir uns das zweite an, worauf Sie unten achten.
Schritt 2: Wenn Sie das Protokoll ausgeben, müssen Sie die spezifische Klasse einstellen, die dem Protokollobjekt entspricht.
Was bedeutet es? Im obigen Konfigurationselement gibt es eine Paketzeichenfolge " net.czt.crazyant.service ". Denken wir also selbst darüber nach, wie log4j -Ausgangsprotokolle in verschiedenen Paketen zu verschiedenen Dateien log. Denken Sie darüber nach, es gibt zwei Methoden:
1. Verwenden Sie die IntercePter- oder AOP -Methode, log4j erkennt die Protokollausgabe für sich selbst. Wenn er erkennt, welches Paket das Protokoll erzeugt wird, wird es in die entsprechende Datei ausgegeben.
2. Der Benutzer übergibt einen Klassenparameter, log4j erhält das entsprechende Paket der Klasse und verwendet diese als Grundlage, um verschiedene Protokolldateien zu lokalisieren.
Wenn man sich den Code ansieht, ist es offensichtlich, dass log4j die letztere einfache und direkte Methode verwendet:
import org.apache.commons.logging.log; import org.apache.commons.logging.logfactory; öffentliche Klasse myclassimpl implementiert myclass { / ** * leher * / private statische legale logger = logfactory.getLog (myclassimpl.class); / ** * mein func */ public void myfunc () {logger.info ("Myfunc."); }} In logger = LogFactory.getLog(MyClassImpl.class) wird der Klassenparameter, der den Logger verwendet, übergeben, und die Paketadresse, die die Klasse widerspiegelt, ist die von Log4J verwendete Paketadresse, um das Protokoll auszugeben.
Dieser Ansatz hat auch leistungsstarke Merkmale, die die logische Protokollklassifizierung erleichtern. Zum Beispiel gehören viele Codes nicht zu einem Paket, sondern gehören logisch zusammen. Beispielsweise ist die Verarbeitung von Nachrichten nicht nur die Schnittstelle, die das Servicepaket aufruft, sondern auch den Betrieb des Sendens von MSG aufrufen kann. Wenn Sie einige Protokolle im MSG -Paket für den Dienst ausgeben möchten, wird bei der Initialisierung des MSG -Protokolls eine Serviceklasse gerade übergeben.
Oder für alle Protokolle einer bestimmten Klasse können alle Logger -Objekte aus einer einzelnen eingekapselten Objektinstanz stammen, und es gibt nur einen Parameter in dieser einzelnen Objektinstanz, mit dem diese logische Klassifizierung identifiziert werden kann.
Zusammenfassen
In Log4j.properties wird eine separate Ausgabe der Paketprotokolle oder der spezifischen Klasse unterstützt. Es muss jedoch auch die Logger -Initialisierung im Code dem Paket in der Protokollkonfiguration entsprechen.
Okay, das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, der Inhalt dieses Artikels wird für das Studium oder die Arbeit aller Hilfe helfen. Wenn Sie Fragen haben, können Sie eine Nachricht zur Kommunikation überlassen.