Heim  >  Artikel  >  Java  >  So verwenden Sie Log4j, um Protokolle verschiedener Pakete in verschiedene Dateien auszugeben

So verwenden Sie Log4j, um Protokolle verschiedener Pakete in verschiedene Dateien auszugeben

高洛峰
高洛峰Original
2017-01-18 12:42:241254Durchsuche

Vorwort

Da der Umfang des Projekts immer größer wird, werden ständig neue Module eingeführt und verschiedene Module drucken ihre eigenen Protokolle. Am Ende können die Protokolle überhaupt nicht angezeigt werden als mein eigenes Im Projekt gibt es die folgenden Protokolle:

Protokolle zum Empfangen externer Nachrichten und Protokolle zum Senden externer Nachrichten;

Verarbeitungsprotokolle von Hintergrund-Resident-Threads; Externe Schnittstellenzugriffsschnittstellenprotokolle wie Parameter und Rückgabeergebnisse; SQL-Protokolle, die vom Dienst beim Zugriff auf die Datenbank generiert werden

Daunter ist die Menge an Protokolldaten im Nachrichtenprotokoll und im Hintergrundthread sehr groß Wenn alle Protokolle in einer Datei gedruckt werden und Sie die Datei tail -f log.log verwenden, werden Sie feststellen, dass das Protokoll schnell scrollt und es unmöglich ist, ein bestimmtes SQL- oder Dienstzugriffsprotokoll anzuzeigen oder sogar zu finden .

Die Lösung besteht darin, verschiedene Protokolle zu klassifizieren und auszugeben, sodass sich die Protokolle nicht gegenseitig beeinflussen, insbesondere die wichtigen Schnittstellenzugriffsprotokolle, mit denen Probleme leicht lokalisiert und behoben werden können.

Schritt 1: Konfigurieren Sie in log4j.properties

Veröffentlichen Sie zunächst alle meine eigenen log4j.properties-Konfigurationen:

Unterhalb der Konfigurationsdatei kann es praktisch sein Wie Sie sehen, gebe ich Nachricht (Nachricht), Async (Backend-Thread), Showsql (Datenbankprotokoll) und Service (Schnittstellenaufruf) jeweils in verschiedene Protokolldateien aus.

Einige Erklärungen:
log4j.rootLogger=INFO, console, file
  
log4j.appender.console=net.czt.log.AsyncConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d [%t] %-5p crazyant-web %-17c{2} (%13F:%L) %X{USER_ID}|%X{USER_IP}|%X{SERVER_ADDRESS}|%X{SERVER_NAME}|%X{REQUEST_URI}|%X{SESSION_ID} - %m%n
log4j.appender.console.bufferSize=10000
log4j.appender.console.encoding=UTF-8
  
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.file=/home/work/apache-tomcat-6.0.39/logs/crazyant.log
log4j.appender.file.MaxBackupIndex=5
log4j.appender.file.MaxFileSize=1GB
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%-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} method:%l%n%m%n
log4j.appender.file.bufferSize=10000
log4j.appender.file.encoding=UTF-8
  
log4j.logger.net.czt.crazyant.msg=DEBUG, message
log4j.additivity.net.czt.crazyant.msg=false
log4j.appender.message=org.apache.log4j.RollingFileAppender
log4j.appender.message.File=/home/work/apache-tomcat-6.0.39/logs/crazyant_message.log
log4j.appender.message.Append=true
log4j.appender.message.MaxFileSize=1GB
log4j.appender.message.MaxBackupIndex=5
log4j.appender.message.layout=org.apache.log4j.PatternLayout
log4j.appender.message.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%-5p][%c{1}] [%t] - %m%n
log4j.appender.message.encoding=UTF-8
  
log4j.logger.net.czt.crazyant.async.service=DEBUG, async
log4j.additivity.net.czt.crazyant.async.service=false
log4j.appender.async=org.apache.log4j.RollingFileAppender
log4j.appender.async.File=/home/work/apache-tomcat-6.0.39/logs/crazyant_async.log
log4j.appender.async.Append=true
log4j.appender.async.MaxFileSize=1GB
log4j.appender.async.MaxBackupIndex=5
log4j.appender.async.layout=org.apache.log4j.PatternLayout
log4j.appender.async.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%-5p][%c{1}] [%t] - %m%n
log4j.appender.async.encoding=UTF-8
  
log4j.logger.net.czt.orm.mybatis.SqlMonitorManager=DEBUG, showsql
log4j.additivity.net.czt.orm.mybatis.SqlMonitorManager=false
log4j.logger.net.czt.transaction.interceptor.SmartTransactionInterceptor=DEBUG, showsql
log4j.additivity.net.czt.transaction.interceptor.SmartTransactionInterceptor=false
log4j.appender.showsql=org.apache.log4j.RollingFileAppender
log4j.appender.showsql.File=/home/work/apache-tomcat-6.0.39/logs/crazyant_sql.log
log4j.appender.showsql.Append=true
log4j.appender.showsql.MaxFileSize=1GB
log4j.appender.showsql.MaxBackupIndex=5
log4j.appender.showsql.layout=org.apache.log4j.PatternLayout
log4j.appender.showsql.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%-5p][%c{1}] [%t] - %m%n
log4j.appender.showsql.encoding=UTF-8
  
log4j.logger.net.czt.crazyant.service=DEBUG, service
log4j.additivity.net.czt.crazyant.service=false
log4j.appender.service=org.apache.log4j.RollingFileAppender
log4j.appender.service.File=/home/work/apache-tomcat-6.0.39/logs/crazyant_service.log
log4j.appender.service.Append=true
log4j.appender.service.MaxFileSize=1GB
log4j.appender.service.MaxBackupIndex=5
log4j.appender.service.layout=org.apache.log4j.PatternLayout
log4j.appender.service.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%-5p][%c{1}] [%t] - %m%n
log4j.appender.service.encoding=UTF-8

log4j.rootLogger=INFO, Konsole, Datei

log4j hat das Konzept eines RootLoggers und eines normalen Loggers. Standardmäßig benötigen wir nur einen RootLogger. Das heißt, alle Protokolle werden nur in diese Protokolldatei ausgegeben.

Sehen Sie sich die Konfiguration eines gemeinsamen Loggers an (am Beispiel des Schnittstellenprotokolldienstes):

1. log4j.logger.net.czt.crazyant.service=DEBUG, service

„net.czt.crazyant.service“ in diesem Satz stellt den vollständigen Pfad des Pakets dar, in dem die allgemeine Logger-Protokollkonfiguration wirksam wird


Der Farbdienst stellt die dar Name des gemeinsamen Loggers


2. log4j.additivity.net.czt.crazyant.service=false


Der „net.czt.crazyant.service“ ist der Dasselbe wie oben, was darauf hinweist, dass das Paket, auf das das Konfigurationselement abzielt


Die Bedeutung dieser Konfiguration besteht nicht darin, das Protokoll des Pakets in das RootLogger-Protokoll auszugeben, sondern nur in das von Ihnen konfigurierte Protokoll auszugeben ;


3. log4j.appender.service=org.apache.log4j.RollingFileAppender und das Konfigurationselement unter diesem Konfigurationsabschnitt


Die Zeichenfolge „service“ hier, und die erste Konfiguration oben Der „Dienst“ des Elements ist derselbe und gibt die Konfiguration des normalen Loggers an.


Die folgenden Konfigurationselemente sind die gleichen wie beim RootLogger und geben die tägliche Ausgabedatei und Codierung an UTF8, Fragmentierungsregeln, Ausgabemodus jeder Zeile usw.


Das Problem, auf das ich selbst stieß, war, dass ich nach der Konfiguration der oben genannten log4j.properties feststellte, dass jede Protokolldatei erstellt wurde, aber keine Inhalt darin. Warum ist das so? Schauen wir uns den zweiten wichtigen Punkt unten an.


Schritt 2. Bei der Ausgabe von Protokollen müssen Sie die spezifische Klasse festlegen, die dem Protokollobjekt entspricht.

Was bedeutet

? Unter den oben genannten Konfigurationselementen gibt es eine Paketzeichenfolge von „net.czt.crazyant.service“. Denken wir also darüber nach, wie log4j die Logger-Protokolle in verschiedenen Paketen in verschiedene Dateien ausgibt. Denken Sie darüber nach, es gibt zwei Typen Methode:

1. Mithilfe von Interceptor oder AOP erkennt log4j selbst die Protokollausgabe, erkennt, aus welchem ​​Paket das Protokoll generiert wurde, und gibt es in die entsprechende Datei aus

2 , der Benutzer übergibt einen Klassenparameter, log4j ruft das der Klasse entsprechende Paket ab und verwendet dieses als Standard, um verschiedene Protokolldateien zu finden.


Ein Blick auf den Code zeigt, dass log4j das verwendet Letztere einfache Methode Direkter Weg:


In logger = LogFactory.getLog(MyClassImpl.class) wird der Klassenparameter, der den Logger verwendet, übergeben und die Paketadresse der reflektierten Klasse wird von verwendet log4j Um die Paketadresse des Protokolls auszugeben.

Dieser Ansatz ist auch insofern leistungsstark, als er die logische Protokollklassifizierung erleichtert. Beispielsweise gehören viele Codes nicht zu einem Paket, sondern gehören logisch zusammen. Beispielsweise geht es bei der Nachrichtenverarbeitung nicht nur um den Aufruf des Dienstes Die Schnittstelle kann auch den Vorgang zum Senden von Nachrichten aufrufen. Wenn Sie einige Protokolle im Nachrichtenpaket an den Dienst ausgeben möchten, übergeben Sie einfach eine Serviceklasse, wenn der Nachrichtenprotokollierer initialisiert wird.
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
  
public class MyClassImpl implements MyClass {
 /**
  * loger
  */
 private static final Log logger = LogFactory.getLog(MyClassImpl.class);
  
 /**
  * my func
  */
 public void myfunc() {
  logger.info("call method myfunc.");
 }
}

Oder für alle Protokolle eines bestimmten Typs stammen alle ihre Logger-Objekte von einer einzigen gekapselten Objektinstanz, und es gibt nur einen Parameter, der von dieser einzelnen Objektinstanz übergeben wird und zur Identifizierung verwendet wird. Klassifizieren Sie sie einfach logisch.

Zusammenfassung

In Log4j.properties wird die separate Ausgabe von Protokollen von Paketen oder bestimmten Klassen unterstützt, es muss jedoch auch dem Paket in der Protokollkonfiguration beim Logger entsprechen können wird im Code initialisiert.

Okay, das ist der gesamte Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels für das Studium oder die Arbeit von Nutzen sein kann. Wenn Sie Fragen haben, können Sie eine Nachricht hinterlassen.

Weitere verwandte Artikel zur Verwendung von Log4j zur Ausgabe von Protokollen verschiedener Pakete in verschiedene Dateien finden Sie auf der chinesischen PHP-Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn