Logback - set log file name programmatically

后端 未结 4 1436
天涯浪人
天涯浪人 2020-12-04 19:19

I am using logback, and I am trying to set the log file name programmatically within my Java program (similar to Setting Logback Appender path programmatically), and I tried

相关标签:
4条回答
  • 2020-12-04 19:59

    Looks like the logger is initialized twice. First time, probably when the app loads and it couldn't resolve the ${log_file_name}. If you start the app with -Dlog_file_name=*something* you can verify this behavior if it creates another log file with the name *something*

    0 讨论(0)
  • 2020-12-04 20:07

    Here is what you can do to ignore those extra file creation.Below is the config file

    <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>  
    

    Here is the java part,

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

    I got this from here http://logback.qos.ch/faq.html#sharedConfiguration

    0 讨论(0)
  • 2020-12-04 20:09

    I believe the following to be closer to what you want.

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

    If all you need is to add a timestamp of the log file name, logback already supports the timestamp element. Thus, you actually don't need any custom code at all.

    0 讨论(0)
  • 2020-12-04 20:17

    To separate/sift log messages to different files depending on a runtime attribute, you might want to use ch.qos.logback.classic.sift.SiftingAppender.

    In a nutshell, this allows you to set up a FileAppender (or any other appender) with <file>${userid}.log</file> where ${userId} is substituted based on the MDC (Mapped Diagnostic Context) (e.g., MDC.put("userid", "Alice");). See the first link for the complete example.

    0 讨论(0)
提交回复
热议问题