2017-06-06 65 views
1

私は、slf4jから来るロガーインスタンスを持っています。このロガーはすでにコンソールにログを記録します。 スレッドごとに別々にファイルに記録するappenderを追加します。だから私は使用したいSiftingAppenderLogbackで動的にAppenderを追加する

私はロガーインスタンスにアペンダーを追加するために、次のutilsクラスを作成しました。コンソール上の出力は以下の通りです

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

しかし、ロガー情報のどれもが、実際に印刷されていない私はここにログをテストしようとしています

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; 

    } 
} 

コンソールまたはファイルに保存します。 siftingAppenderを追加しないと、コンソールに正しく表示されます。プログラムでSiftingAppenderを追加するにはどうすればよいですか?

私はlogbackでロギングを有効にした後logback.xml

を変更することはできないのです、私は次の取得:

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

アペンダー工場でアペンダーを構築する方法に問題があるようです。確かに、正確な問題は何ですか、私は以下のコードを試して、それは働いた。 '

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

`

関連する問題