Custom Logback Appender — добавление заголовка файла в начало и его прокрутка

Функциональность, которая мне нужна, — это запись строки заголовка в начале настроенного файла журнала. Файл журнала должен, кроме того, прокручиваться в зависимости от времени (я имею в виду logback 1.0.7).

Итак, я думаю о написании Appender, хотя я не уверен, что это не пользовательский Layout, который мне действительно нужен.

1) Добавление

Согласно документации logback, правильный подход — расширить AppenderSkeleton, но тогда как мне объединить это с RollingFileAppender (чтобы сделать перенос файла?)

С другой стороны, если я расширяю RollingFileAppender, какой метод мне переопределить, чтобы просто украсить существующую функциональность? Как мне сказать ему писать эту конкретную строку только в начале файла?

2) Макет

Аналогичным образом подход расширяет LayoutBase и обеспечивает реализацию doLayout(ILoggingEvent event). Но опять же, я не знаю, как просто украсить поведение — просто добавить новую строку в файл, а не нарушить его функциональность (потому что я все еще хочу, чтобы остальные журналы отображались правильно).

getFileHeader() в LayoutBase выглядит многообещающе, но как мне его использовать? Он вообще предназначен для переопределения пользовательскими макетами? (наверное да, так как это часть интерфейса Layout, но тогда как?)

Спасибо!


person teo    schedule 08.11.2012    source источник


Ответы (2)


Здесь я отвечаю на свой вопрос, на случай, если кто-то еще столкнется с той же проблемой. Вот как я в конце концов сделал это (не знаю, однако, ортодоксальный ли это способ):

Вместо расширения AppenderSkeleton я расширил RollingFileAppender (чтобы сохранить функциональность прокрутки) и переопределил его метод openFile(). Здесь я мог манипулировать файлом журнала и записывать в него заголовок, позволив ему делать все, что нужно по умолчанию. Так:

 public void openFile(String fileName) throws IOException {
        super.openFile(fileName);
        File activeFile = new File(getFile());
        if (activeFile.exists() && activeFile.isFile() && activeFile.length() == 0) {
            FileUtils.writeStringToFile(activeFile, header);
        }
  }

Я настроил заголовок в logback.xml так просто: <header> value </header>. Это вводит его в поле заголовка моего нового приложения.

Кажется, работает без проблем, но, пожалуйста, напишите, если вы знаете лучший способ!

person teo    schedule 17.11.2012
comment
@teo вы знаете, как мы можем получить пользовательское свойство, определенное в logback.xml, в методе запуска любого пользовательского класса Appender? - person Mihir; 29.07.2013

У вашего решения есть проблема: оно удаляет первую строку журнала каждого нового файла. Я думаю, это потому, что вы пишете заголовок, а файл открывается по журналу. Я нашел другое решение, у которого нет этой проблемы:

public void openFile(String fileName) throws IOException
{
    super.openFile(fileName);
    File activeFile = new File(getFile());
    if (activeFile.exists() && activeFile.isFile() && activeFile.length() == 0)
    {
        lock.lock();
        try
        {
            new PrintWriter(new OutputStreamWriter(getOutputStream(), StandardCharsets.UTF_8), true).println("your header");
        }
        finally
        {
            lock.unlock();
        }
    }
}
person Zlika    schedule 19.02.2015