Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Logback-以编程方式设置日志文件名_Java_Slf4j_Logback - Fatal编程技术网

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

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

我正在使用logback,并尝试在Java程序中以编程方式设置日志文件名(类似于),我尝试如下调整该解决方案:

在logback-test.xml中:

<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");