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

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

Jan 18, 2017 pm 12:42 PM

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
Nach dem Login kopieren

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.");
 }
}
Nach dem Login kopieren

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!

Erklärung dieser Website
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

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Wie funktioniert der Klassenladungsmechanismus von Java, einschließlich verschiedener Klassenloader und deren Delegationsmodelle? Wie funktioniert der Klassenladungsmechanismus von Java, einschließlich verschiedener Klassenloader und deren Delegationsmodelle? Mar 17, 2025 pm 05:35 PM

Mit der Klassenbelastung von Java wird das Laden, Verknüpfen und Initialisieren von Klassen mithilfe eines hierarchischen Systems mit Bootstrap-, Erweiterungs- und Anwendungsklassenloadern umfasst. Das übergeordnete Delegationsmodell stellt sicher

Wie implementiere ich mehrstufige Caching in Java-Anwendungen mit Bibliotheken wie Koffein oder Guava-Cache? Wie implementiere ich mehrstufige Caching in Java-Anwendungen mit Bibliotheken wie Koffein oder Guava-Cache? Mar 17, 2025 pm 05:44 PM

In dem Artikel wird in der Implementierung von mehrstufigem Caching in Java mithilfe von Koffein- und Guava-Cache zur Verbesserung der Anwendungsleistung erläutert. Es deckt die Einrichtungs-, Integrations- und Leistungsvorteile sowie die Bestrafung des Konfigurations- und Räumungsrichtlinienmanagements ab

Wie kann ich JPA (Java Persistence-API) für Objektrelationszuordnungen mit erweiterten Funktionen wie Caching und faulen Laden verwenden? Wie kann ich JPA (Java Persistence-API) für Objektrelationszuordnungen mit erweiterten Funktionen wie Caching und faulen Laden verwenden? Mar 17, 2025 pm 05:43 PM

In dem Artikel werden mit JPA für Objektrelationszuordnungen mit erweiterten Funktionen wie Caching und faulen Laden erläutert. Es deckt Setup, Entity -Mapping und Best Practices zur Optimierung der Leistung ab und hebt potenzielle Fallstricke hervor. [159 Charaktere]

Wie benutze ich Maven oder Gradle für das fortschrittliche Java -Projektmanagement, die Erstellung von Automatisierung und Abhängigkeitslösung? Wie benutze ich Maven oder Gradle für das fortschrittliche Java -Projektmanagement, die Erstellung von Automatisierung und Abhängigkeitslösung? Mar 17, 2025 pm 05:46 PM

In dem Artikel werden Maven und Gradle für Java -Projektmanagement, Aufbau von Automatisierung und Abhängigkeitslösung erörtert, die ihre Ansätze und Optimierungsstrategien vergleichen.

Wie erstelle und verwende ich benutzerdefinierte Java -Bibliotheken (JAR -Dateien) mit ordnungsgemäßem Versioning und Abhängigkeitsmanagement? Wie erstelle und verwende ich benutzerdefinierte Java -Bibliotheken (JAR -Dateien) mit ordnungsgemäßem Versioning und Abhängigkeitsmanagement? Mar 17, 2025 pm 05:45 PM

In dem Artikel werden benutzerdefinierte Java -Bibliotheken (JAR -Dateien) mit ordnungsgemäßem Versioning- und Abhängigkeitsmanagement erstellt und verwendet, wobei Tools wie Maven und Gradle verwendet werden.

See all articles