Java Logback-以编程方式设置日志文件名
我正在使用logback,并尝试在Java程序中以编程方式设置日志文件名(类似于),我尝试如下调整该解决方案: 在logback-test.xml中:Java Logback-以编程方式设置日志文件名,java,slf4j,logback,Java,Slf4j,Logback,我正在使用logback,并尝试在Java程序中以编程方式设置日志文件名(类似于),我尝试如下调整该解决方案: 在logback-test.xml中: <appender name="FILE" class="ch.qos.logback.core.FileAppender"> <file>log/${log_file_name}.log</file> ... 然而,结果是两个日志,一个是完整的,命名为我想要的,例如“1319041145343.lo
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>log/${log_file_name}.log</file>
...
然而,结果是两个日志,一个是完整的,命名为我想要的,例如“1319041145343.log”,另一个是空的,命名为“log\u file\u name\u is\u UNDEFINED.log”。如何停止创建另一个空日志文件?记录器似乎已初始化两次。第一次,可能是当应用程序加载并且无法解析
${log\u file\u name}
时。如果你用-Dlog\u file\u name=*something*
启动应用程序,如果它创建另一个名为*something*
的日志文件,你可以验证这个行为。我相信下面的内容更接近你想要的
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已经存在了。因此,您实际上根本不需要任何自定义代码。以下是您可以忽略这些额外文件创建的方法。下面是配置文件
<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>
我从这里得到了这个以根据运行时属性将日志消息分离/筛选到不同的文件,您可能需要使用
简而言之,这允许您使用
${userid}.log
设置一个文件appender
(或任何其他appender),其中${userid}
基于(例如,MDC.put(“userid”,“Alice”);
)。查看第一个链接以获取完整的示例。通过编程设置文件名的方法是使用所需的配置(名称、类别、包等)实例化一个文件appender,并将其添加到appender层次结构中。谢谢,我在VM参数中添加了-Dlog\u file\u name=verify
,我确实得到了一个名为“verify.log”的空日志-有没有办法阻止记录器启动两次?谢谢你的帮助,我会尝试一下。(我只是以时间戳为例,实际文件名会有所不同)谢谢,这很有效-在logback-test.xml中,我不再指定文件附加器,而在java代码中,我创建了一个文件附加器并将其附加到“根”记录器。slf4j的目的不是要避免导入ch.qos.logback.classic。Logger@Zombies:是的。然而,正如名称所示,slf4j应该是简单的,因此slf4j API不提供对日志输出的任何控制。如果需要该控件,则必须直接与所使用的日志框架对话(并依赖于该框架)。另一种方法是在调用Logger之前初始化所有系统变量。这同样有效。最终使用system.setProperty(..)而不是重置上下文。对我来说似乎更干净。感谢eg。不幸的是,当您想要共享配置时,使用系统属性无法工作。代码的唯一问题似乎是您正在设置System.setProperty(“log\u file\u name”,logFileName)代码>太晚了。在执行Logback autoconfig之前执行它,您就可以得到您想要的。实际上,这比在代码段中要容易得多:
<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>
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");