Logback - 以编程方式设置日志文件名

新手上路,请多包涵

我正在使用 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”。如何停止创建其他空日志文件?

原文由 conorsomahony 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 654
2 个回答

我相信以下内容更接近您想要的。

 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 已经支持时间戳元素。因此,您实际上根本不需要任何自定义代码。

原文由 Ceki 发布,翻译遵循 CC BY-SA 3.0 许可协议

要根据运行时属性将日志消息分离/筛选到不同的文件,您可能需要使用 ch.qos.logback.classic.sift.SiftingAppender

简而言之,这允许您使用 --- 设置 FileAppender (或任何其他附加程序),其中 <file>${userid}.log</file> ${userId} 替换为基于 MDC 的诊断映射) (例如 MDC.put("userid", "Alice"); )。有关完整示例,请参阅第一个链接。

原文由 simon04 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题