Logback - установить имя файла журнала программно - PullRequest
31 голосов
/ 19 октября 2011

Я использую logback и пытаюсь программно установить имя файла журнала в моей Java-программе (аналогично Установка пути Logback Appender программно ), и я попытался адаптировать это решение следующим образом:

В logback-test.xml:

<appender name="FILE" class="ch.qos.logback.core.FileAppender">
  <file>log/${log_file_name}.log</file>
  ...

И снова в моей программе на Java:

String logFileName = "" + System.currentTimeMillis(); // just for example
System.setProperty("log_file_name", logFileName);

LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
ContextInitializer ci = new ContextInitializer(lc);
lc.reset();
try
{
    // I prefer autoConfig() over JoranConfigurator.doConfigure() so I
    // wouldn't need to find the file myself.
    ci.autoConfig();
}
catch (JoranException e)
{
    // StatusPrinter will try to log this
    e.printStackTrace();
}
StatusPrinter.printInCaseOfErrorsOrWarnings(lc);

Однако в результате получается два журнала, один полный и названный так, как я хотел, например, «1319041145343.log», а другой - пустой и с именем «log_file_name_IS_UNDEFINED.log». Как остановить создание этого другого пустого файла журнала?

Ответы [ 4 ]

33 голосов
/ 19 октября 2011

Я считаю, что следующее будет ближе к тому, что вы хотите.

import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
import ch.qos.logback.core.FileAppender;
import ch.qos.logback.core.util.StatusPrinter;
import org.slf4j.LoggerFactory;
import ch.qos.logback.classic.LoggerContext;

public class Main {
  public static void main(String[] args) {
    LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();

    FileAppender fileAppender = new FileAppender();
    fileAppender.setContext(loggerContext);
    fileAppender.setName("timestamp");
    // set the file name
    fileAppender.setFile("log/" + System.currentTimeMillis()+".log");

    PatternLayoutEncoder encoder = new PatternLayoutEncoder();
    encoder.setContext(loggerContext);
    encoder.setPattern("%r %thread %level - %msg%n");
    encoder.start();

    fileAppender.setEncoder(encoder);
    fileAppender.start();

    // attach the rolling file appender to the logger of your choice
    Logger logbackLogger = loggerContext.getLogger("Main");
    logbackLogger.addAppender(fileAppender);

    // OPTIONAL: print logback internal status messages
    StatusPrinter.print(loggerContext);

    // log something
    logbackLogger.debug("hello");
  }
}

Если все, что вам нужно, это добавить временную метку имени файла журнала, logback уже поддерживает элемент временной метки .Таким образом, вам вообще не нужен какой-либо специальный код.

12 голосов
/ 18 апреля 2013

Для разделения / просеивания сообщений журнала в разные файлы в зависимости от атрибута времени выполнения вы можете использовать ch.qos.logback.classic.sift.SiftingAppender .

В двух словах, это позволяет вам установить FileAppender (или любого другого приложения) с <file>${userid}.log</file>, где ${userId} заменяется на основе MDC (Mapped Diagnostic Context) (например, MDC.put("userid", "Alice");). Смотрите первую ссылку для полного примера.

8 голосов
/ 04 октября 2012

Вот что вы можете сделать, чтобы игнорировать создание лишних файлов. Ниже приведен файл конфигурации

<configuration>
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<!-- "application-name" is a variable -->
<File>c:/logs/${application-name}.log</File>
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>%d %p %t %c - %m%n</Pattern>
</layout>
</appender>
<root level="debug">
<appender-ref ref="FILE"/>
</root>
</configuration>  

Вот часть Java,

LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
JoranConfigurator jc = new JoranConfigurator();
jc.setContext(context);
context.reset(); // override default configuration
// inject the name of the current application as "application-name"
// property of the LoggerContext
context.putProperty("application-name", NAME_OF_CURRENT_APPLICATION);
jc.doConfigure("/path/to/the/above/configuration/file.xml");

Я получил это отсюда http://logback.qos.ch/faq.html#sharedConfiguration

5 голосов
/ 19 октября 2011

Похоже, регистратор инициализируется дважды. Первый раз, вероятно, когда приложение загружается и не может разрешить ${log_file_name}. Если вы запустите приложение с -Dlog_file_name=*something*, вы можете проверить это поведение, если оно создаст другой файл журнала с именем *something*

...