Wie verwenden Sie AsyncAppender in log4j, um eine Protokollnachricht an den Webdienst zu schreiben? Sollte ich meinen eigenen Appender erstellen, der AsyncAppender erweitert oder nur benutzerdefinierte Appender an den AsyncAppender anfügt? Wenn die zweite Auswahl korrekt ist, wo soll ich das AsyncAppender-Objekt verwenden? Gibt es ein Beispiel?Wie verwende ich AsyncAppender in log4j?
Antwort
Beantworten meiner eigenen Frage.
In der Log4j-Konfigurationsdatei (normalerweise log4j.xml oder log4j.properties) sollten wir AsyncAppender definieren, der sich auf einen echten Appender bezieht (es kann wie in meinem Fall unsere eigene definierte Klasse sein).
Also schrieb ich eine WebServiceAppender-Klasse, die AppenderSkeleton erweitert und 3 abstrakte Methoden implementiert. Die Hauptmethode ist "append", die sich mit dem Web-Service verbindet und alle Informationen an diesen sendet. Das ist es.
Fügen Sie AsyncAppender in der Log4j-Konfigurationsdatei hinzu, die sich auf einen echten Appender bezieht. Für Demo: Hinzufügen AsyncAppender trösten appender in log4j.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd" >
<log4j:configuration>
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%p] %d{dd MMM hh:mm:ss aa} %t [%l] %m%n"/>
</layout>
</appender>
<appender name="async" class="org.apache.log4j.AsyncAppender">
<param name="BufferSize" value="500"/>
<appender-ref ref="console"/>
</appender>
<root>
<priority value="all"></priority>
<appender-ref ref="async"/>
</root>
</log4j:configuration>
Wir wollten log4j.AsyncAppender verwenden, aber keine Setter-Methoden nicht andere Appen an der log4j.property Datei anhängen finden konnten. Also haben wir die log4j.AsyncAppender-Klasse erweitert und einen Setter hinzugefügt, um andere Appender hinzuzufügen. Dies hat dazu beigetragen, dass der Hauptprogramm-Thread unabhängig von der Protokollierungsoperation von log4j war. Die Details unten.
log4j Eintrag:
definieren einen Logger 'com.noPath' mit log4j Datei Appender 'FileAppender'. Beachten Sie, dass der Logger Pfad immateriell ist und daher auch der Name ‚com.noPath‘
log4j.logger.com.noPath=DEBUG,fileAppender
log4j.appender.fileAppender=org.apache.log4j.RollingFileAppender
log4j.appender.fileAppender.File=c:/test.log
definieren den Logger, die geschäftlichen Anforderungen, ‚com.business‘, die Datei appender der vorherigen Schritt Attach ‚FileAppender‘, um die log4j AsyncAppender durch eine benutzerdefinierte Klasse com.log.AsyncAppenderHelper die log4j AsyncAppender
log4j.logger.com.business=DEBUG,asyncLog
log4j.appender.asyncLog=com.log.AsyncAppenderHelper
log4j.appender.asyncLog.appenderFromLogger=com.noPath
die Java-Klasse com.log.AsyncAppenderHelper verlauf log4j.AsyncAppender erstreckt, haben sie in der Klassenpfad zur Verfügung.
package com.log
import java.util.Enumeration;
import org.apache.log4j.Appender;
import org.apache.log4j.AsyncAppender;
import org.apache.log4j.Logger;
/*
* This class helps configure to AsyncAppender from log4j as part of log4j.properties
* You can inject other appenders to AsyncAppender using the AsyncAppenderHelper
* This would free up the main program thread to be independent of log4j's logging operation
* @Author http://www.linkedin.com/in/jobypgeorge
*/
public class AsyncAppenderHelper extends AsyncAppender{
public AsyncAppenderHelper(){
super();
}
public void setAppenderFromLogger(String name){
Logger l = Logger.getLogger(name);
Enumeration<Appender> e = l.getAllAppenders();
while(e.hasMoreElements()){
Appender a = e.nextElement();
this.addAppender(a);
System.out.println("The newAppender "+a.getName() +" attach status "+this.isAttached(a));
}
}
}
nettes Beispiel, wie async Appender in log4j.properties – hudi
verwenden Vorsicht, dies kann leicht zu brechen. Ich habe das versucht, aber der PropertyConfigurator entfernt Appender und fügt sie bei der Verarbeitung wieder hinzu. Mein AsyncAppenderHelper endete mit einem geschlossenen Appender. Deshalb müssen Sie den DomConfigurator (xml) benutzen, um ihn zu benutzen. –
@AlanYackel gibt es keine Möglichkeit, wie man es mit log4j.properties verwendet? Ich kann keine XML-Datei verwenden – hudi
Bitte geben Sie Ihren Beispielcode für andere Benutzer an. danke – philipp
können Sie bitte Code oder einige Zeilen zur Verfügung stellen? –