Пользовательский OutputStreamAppender не запущен: LOGBACK: контекст для <MYAPPENDER>не задан

Я хочу написать пользовательский appender на основе OutputStreamAppender, Я написал следующий класс

package tests;

import java.io.IOException;
import java.io.OutputStream;

import ch.qos.logback.core.OutputStreamAppender;

public class MyAppender<E> extends OutputStreamAppender<E> {
    public MyAppender() {

        System.out.println("MyAppender created");

        setOutputStream(new OutputStream() {

            @Override
            public void write(int b) throws IOException {
                throw new UnsupportedOperationException();
            }
        });
    }
}

тогда я написал следующий бегун:

package tests;

import org.slf4j.LoggerFactory;

import ch.qos.logback.classic.Logger;

public class Runner {

    private static final Logger log = (Logger) LoggerFactory.getLogger(Runner.class);


    public static void main(String[] args) {

        //log.addAppender(new MyAppender<ILoggingEvent>());

        log.info("Hello world");
    }
}

наконец я написал следующее logback.xml:

<configuration>

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{0} - %msg%n</pattern>
        </encoder>
    </appender>

    <appender name="MYAPPENDER" class="tests.MyAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{0} - %msg%n</pattern>
        </encoder>
    </appender>



    <root level="debug">
        <appender-ref ref="STDOUT" />
    </root>

</configuration>

и получил следующий вывод:

MyAppender created
LOGBACK: No context given for tests.MyAppender[null]
20:45:29.957 [main] INFO  Runner - Hello world

это указывает на то, что заявитель создан. Но отсутствие исключений означает, что это никогда не называется.

Вероятно, это связано с сообщением об ошибке, которое я не понимаю: "LOGBACK: контекст для тестов не задан.MyAppender[null]"

Что это значит и как исправить?

2 ответа

Как бы вы задали имя файла, куда хотите написать, есть много других проблем, когда вы расширяете OutputStreamAppender Я бы предпочел расширить FileAppender(который является внутренним расширением outputteamappender) и переопределить метод записи для выполнения пользовательской задачи.

public class MyAppender<E> extends FileAppender<E> {

 @Override
  protected void writeOut(E event) throws IOException {
    /**if (prudent) {
      safeWrite(event);
    } else {
      super.writeOut(event);
    } */
    throw new UnsupportedOperationException();
  }

}

Извините, это была моя ошибка: я забыл установить свой пользовательский appender в <root> тег.

Другие вопросы по тегам