2017-06-06 182 views
1

我有一個來自slf4j的記錄器實例。該記錄器已經記錄到控制檯。 我想添加一個額外的appender它將分別登錄到每個線程的文件。所以我想用SiftingAppender在logback中動態添加Appender

我創建了下面的utils類來添加appender到記錄器實例。

package com.worksap.company.hue.com.bizcore.outputengine.devtools; 

import org.slf4j.LoggerFactory; 

import ch.qos.logback.classic.Logger; 
import ch.qos.logback.classic.LoggerContext; 
import ch.qos.logback.classic.encoder.PatternLayoutEncoder; 
import ch.qos.logback.classic.sift.MDCBasedDiscriminator; 
import ch.qos.logback.classic.sift.SiftingAppender; 
import ch.qos.logback.classic.spi.ILoggingEvent; 
import ch.qos.logback.core.Appender; 
import ch.qos.logback.core.Context; 
import ch.qos.logback.core.joran.spi.JoranException; 
import ch.qos.logback.core.rolling.RollingFileAppender; 
import ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP; 
import ch.qos.logback.core.rolling.TimeBasedRollingPolicy; 
import ch.qos.logback.core.sift.AppenderFactory; 

public class Utils { 

    public static Logger putNewAppender(String file, org.slf4j.Logger log) { 

     LoggerContext lc = (LoggerContext)LoggerFactory.getILoggerFactory(); 
     Logger logger = lc.getLogger(log.getName()); 
     SiftingAppender sa = new SiftingAppender(); 
     sa.setName("SIFT"); 
     sa.setContext(lc); 

     MDCBasedDiscriminator discriminator = new MDCBasedDiscriminator(); 
     discriminator.setKey("logFileName"); 
     discriminator.setDefaultValue("head0"); 
     discriminator.start(); 

     sa.setDiscriminator(discriminator); 

     sa.setAppenderFactory(new AppenderFactory<ILoggingEvent>() { 

      @Override 
      public Appender<ILoggingEvent> buildAppender(Context context, String discriminatingValue) 
        throws JoranException { 
       RollingFileAppender<ILoggingEvent> appender = new RollingFileAppender<>(); 
       appender.setName("ROLLINGFILE-" + discriminatingValue); 
       appender.setContext(context); 
       appender.setFile(discriminatingValue + ".log"); 

       TimeBasedRollingPolicy<ILoggingEvent> policy = new TimeBasedRollingPolicy<>(); 
       policy.setContext(context); 
       policy.setMaxHistory(5); 
       policy.setFileNamePattern(discriminatingValue + "-%d{yyyy-MM-dd-HH-mm}-%i.log.gz"); 
       policy.setParent(appender); 
       policy.start(); 

       SizeAndTimeBasedFNATP<ILoggingEvent> innerpolicy = new SizeAndTimeBasedFNATP<>(); 
       innerpolicy.setContext(context); 
       innerpolicy.setMaxFileSize("512KB"); 
       innerpolicy.setTimeBasedRollingPolicy(policy); 
       innerpolicy.start(); 

       policy.setTimeBasedFileNamingAndTriggeringPolicy(innerpolicy); 
       policy.start(); 

       appender.setRollingPolicy(policy); 

       PatternLayoutEncoder pl = new PatternLayoutEncoder(); 
       pl.setContext(context); 
       pl.setPattern("%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"); 
       pl.start(); 
       appender.setEncoder(pl); 

       appender.start(); 
       return appender; 
      } 
     }); 

     sa.start(); 
     logger.addAppender(sa); 
     logger.setAdditive(false); 

     return logger; 

    } 
} 

我想測試此日誌:

@Slf4j 
public class IfxOutputJobToolTest { 

    @Test 
    public void outputTest() throws Exception { 

     Logger logger2 = Utils.putNewAppender("C:\\Users\\works\\Downloads\\somename", log); 
     MDC.put("logFileName", "somename"); 
     logger2.info("something is getting logged"); 
     logger2.error("somerghing"); 
     logger2.warn("somrgklsajg"); 
     logger2.debug("ser"); 
     MDC.remove("logFileName"); 

     LoggerContext context = (LoggerContext)LoggerFactory.getILoggerFactory(); 
     for (ch.qos.logback.classic.Logger logger3 : context.getLoggerList()) { 
      for (Iterator<Appender<ILoggingEvent>> index = logger3.iteratorForAppenders(); index.hasNext();) { 
       Appender<ILoggingEvent> appender = index.next(); 
       System.out.println(appender); 
      } 
     } 
    } 
} 

控制檯上的輸出如下:

ch.qos.logback.classic.sift.SiftingAppender[SIFT] 
ch.qos.logback.core.ConsoleAppender[CONSOLE] 
ch.qos.logback.core.ConsoleAppender[CONSOLE] 
ch.qos.logback.core.ConsoleAppender[CONSOLE_SPRING] 

但是,沒有任何的記錄信息實際上是印在控制檯或文件中。如果我不添加siftingAppender,它可以在控制檯上正確打印。我怎樣才能以編程方式添加SiftingAppender

我不允許改變logback.xml

中的logback啓用日誌記錄後,我得到如下:

16:40:08,943 |-INFO in c.q.l.core.rolling.TimeBasedRollingPolicy - Will use gz compression 
16:40:08,946 |-INFO in c.q.l.core.rolling.TimeBasedRollingPolicy - Will use the pattern somename-%d{yyyy-MM-dd-HH-mm}-%i.log for the active file 
16:40:08,956 |-INFO in c.q.l.core.rolling.DefaultTimeBasedFileNamingAndTriggeringPolicy - The date pattern is 'yyyy-MM-dd-HH-mm' from file name pattern 'somename-%d{yyyy-MM-dd-HH-mm}-%i.log.gz'. 
16:40:08,956 |-INFO in c.q.l.core.rolling.DefaultTimeBasedFileNamingAndTriggeringPolicy - Roll-over every minute. 
16:40:08,957 |-INFO in c.q.l.core.rolling.DefaultTimeBasedFileNamingAndTriggeringPolicy - Setting initial period to Tue Jun 06 16:35:47 JST 2017 
16:40:08,962 |-INFO in [email protected] - The date pattern is 'yyyy-MM-dd-HH-mm' from file name pattern 'somename-%d{yyyy-MM-dd-HH-mm}-%i.log.gz'. 
16:40:08,962 |-INFO in [email protected] - Roll-over every minute. 
16:40:08,962 |-INFO in [email protected] - Setting initial period to Tue Jun 06 16:35:47 JST 2017 
16:40:08,964 |-INFO in c.q.l.core.rolling.TimeBasedRollingPolicy - Will use gz compression 
16:40:08,964 |-INFO in c.q.l.core.rolling.TimeBasedRollingPolicy - Will use the pattern somename-%d{yyyy-MM-dd-HH-mm}-%i.log for the active file 
16:40:08,965 |-INFO in [email protected] - The date pattern is 'yyyy-MM-dd-HH-mm' from file name pattern 'somename-%d{yyyy-MM-dd-HH-mm}-%i.log.gz'. 
16:40:08,966 |-INFO in ch.qos.l[email protected] - Roll-over every minute. 
16:40:08,966 |-INFO in [email protected] - Setting initial period to Tue Jun 06 16:35:47 JST 2017 
16:40:08,969 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[ROLLINGFILE-somename] - Active log file name: somename.log 
16:40:08,969 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[ROLLINGFILE-somename] - File property is set to [somename.log] 
16:40:08,975 |-INFO in c.q.l.co.rolling.helper.RenameUtil - Renaming file [somename.log] to [somename.log91512733365898.tmp] 
16:40:08,979 |-INFO in ch[email protected]96be1ae - first clean up after appender initialization 
16:40:08,979 |-INFO in ch[email protected]96be1ae - periodsElapsed = 336 
16:40:08,979 |-INFO in ch.qos.logback.core.rolling.helper.Compressor - GZ compressing [somename.log91512733365898.tmp] as [somename-2017-06-06-16-35-0.log.gz] 

編輯

日誌中獲取打印在控制檯上刪除此之後行logger.setAdditive(false);。但是,我看不到創建的文件。

回答

0

看來你在appender工廠裏建造appender的方式存在一些問題。不知道,確切的問題是什麼,但我嘗試了下面的代碼,它的工作。 '

sa.setAppenderFactory(新AppenderFactory(){

    public Appender<ILoggingEvent> buildAppender(Context context, String discriminatingValue) 
         throws JoranException { 
        PatternLayoutEncoder ple = new PatternLayoutEncoder(); 

        ple.setPattern("%date [%thread] [%file:%line] %msg%n"); 
        ple.setContext(context); 
        ple.start(); 


        RollingFileAppender<ILoggingEvent> logFileAppender = new RollingFileAppender(); 
          logFileAppender.setContext(context); 
          logFileAppender.setName("File-"+discriminatingValue); 
          logFileAppender.setEncoder(ple); 
          logFileAppender.setFile(filename+"-"+discriminatingValue+".txt"); 

          SizeAndTimeBasedRollingPolicy<ILoggingEvent> logFilePolicy = new SizeAndTimeBasedRollingPolicy(); 
          logFilePolicy.setContext(context); 
          logFilePolicy.setParent(logFileAppender); 
          logFilePolicy.setFileNamePattern(filename+"-"+discriminatingValue+"-%d{yyyy-MM-dd}.%i.txt"); 
          logFilePolicy.setMaxHistory(5); 
          logFilePolicy.setMaxFileSize(FileSize.valueOf("512kb")); 
          logFilePolicy.setTotalSizeCap(FileSize.valueOf("1gb")); 
          logFilePolicy.start(); 

          logFileAppender.setRollingPolicy(logFilePolicy); 
          logFileAppender.start(); 

          logFileAppender.start(); 
        return logFileAppender; 
       } 
      }); 

`