Пользовательский 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>
тег.