Вопрос по appender, log4j – Как использовать AsyncAppender в log4j?

26

Как использовать AsyncAppender в log4j для записи сообщения журнала в веб-сервис? Должен ли я создать свой собственный Appender, который бы расширял AsyncAppender или просто прикреплял пользовательские приложения к AsyncAppender? Если второй вариант правильный, где я должен взять объект AsyncAppender? Есть ли пример?

Ваш Ответ

3   ответа
9

но не смогли найти какие-либо методы установки для присоединения других дополнений в файле 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'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));
        }

     }
}
Осторожно, это может легко сломаться. Я пробовал это, но PropertyConfigurator удаляет аппендеры и повторно добавляет их в процессе обработки. Мой AsyncAppenderHelper закончил с закрытым аппендером. Вот почему вам нужно использовать DomConfigurator (xml) для его использования.
хороший пример, как использовать async appender в log4j.properties
@AlanYackel нет варианта, как использовать его с log4j.properties? Я не могу использовать XML-файл
-4

В файле конфигурации log4j (обычно это log4j.xml или log4j.properties) мы должны определить AsyncAppender, который будет ссылаться на реального appender (это может быть наш собственный определенный класс, как в моем случае).

Поэтому я написал класс WebServiceAppender, который расширяет AppenderSkeleton и реализует 3 абстрактных метода. Основным методом является "добавление". который подключается к веб-сервису и отправляет всю информацию ему. Вот и все.

Можете ли вы предоставить код или несколько строк?
Пожалуйста, предоставьте ваш пример кода для других пользователей. Спасибо
39

который будет ссылаться на настоящего 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>
номер строки не будет отображаться
Из соображений производительности лучше всегда ограничивать приоритет root на более высоком уровне. Увидетьstackoverflow.com/a/13144054/603516.
Можете ли вы привести тот же пример, но в формате файла log4j.properties?

Похожие вопросы