Как использовать AsyncAppender в log4j, чтобы записать сообщение журнала в веб-службу? Должен ли я создать свой собственный Appender, который расширяет AsyncAppender или просто прикрепляет пользовательские приложения к AsyncAppender? Если второй выбор правильный, где я должен взять объект AsyncAppender? Есть ли какой-нибудь пример?
Как использовать AsyncAppender в log4j?
Ответ 1
Отвечая на мой собственный вопрос.
В файле конфигурации log4j (обычно это log4j.xml или log4j.properties) мы должны определить AsyncAppender, который будет ссылаться на реальный appender (это может быть наш собственный определенный класс, как в моем случае).
Итак, я написал класс WebServiceAppender, который расширяет AppenderSkeleton и реализует 3 абстрактных метода. Основным методом является "append", который подключается к веб-службе и отправляет всю информацию на него. Что это.
Ответ 2
Добавить AsyncAppender в файле конфигурации log4j, который будет ссылаться на реальный appender. Для демонстрации: добавление asyncappender в консольный appender в 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>
Ответ 3
Мы хотели использовать log4j.AsyncAppender, но не смогли найти какие-либо методы настройки для присоединения других добавлений в файле log4j.property. Поэтому мы расширили класс log4j.AsyncAppender и добавили сеттер для добавления других приложений. Это помогло основному потоку программы быть независимым от ведения журнала log4j. Подробности ниже.
Запись log4j:
Определите регистратор "com.noPath" с log4j File Appender, "fileAppender". Обратите внимание, что путь к журналу несуществен, и, следовательно, имя "com.noPath"
log4j.logger.com.noPath=DEBUG,fileAppender
log4j.appender.fileAppender=org.apache.log4j.RollingFileAppender
log4j.appender.fileAppender.File=c:/test.log
Определите регистратор, которому нужны бизнес, "com.business", присоедините файл-приложение предыдущего шага "fileAppender" к log4j AsyncAppender через пользовательский класс com.log.AsyncAppenderHelper, который расширяет log4j AsyncAppender
log4j.logger.com.business=DEBUG,asyncLog
log4j.appender.asyncLog=com.log.AsyncAppenderHelper
log4j.appender.asyncLog.appenderFromLogger=com.noPath
Класс java com.log.AsyncAppenderHelper, расширяющий log4j.AsyncAppender, доступен в пути к классу.
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 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));
}
}
}