简体   繁体   English

在Logback中动态添加Appender

[英]Adding Appender dynamically in logback

I have a logger instance coming from slf4j. 我有一个来自slf4j的记录器实例。 This logger already logs to console. 该记录器已经登录到控制台。 I want to add an additional appender to it which will log to a file separately for each thread. 我想为其添加一个附加的追加程序,该追加程序将分别记录每个线程的文件。 So I want to use the SiftingAppender 所以我想使用SiftingAppender

I created the following utils class to add an appender to the logger instance. 我创建了以下utils类,以将追加器添加到记录器实例。

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;

    }
}

I am trying to test the log here: 我正在尝试在此处测试日志:

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

The output on the console is the following: 控制台上的输出如下:

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]

But, none of the logger information is actually printed on the console or in a file. 但是,实际上没有任何记录器信息打印在控制台或文件中。 It prints correctly on the console if I don't add the siftingAppender . 如果我不添加siftingAppender在控制台上正确打印。 How can I add the SiftingAppender programatically? 如何以编程方式添加SiftingAppender

I am not allowed to change the logback.xml 我不允许更改logback.xml

After enabling logging in logback, I get the following: 启用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 ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@77a4bac - 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 ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@77a4bac - Roll-over every minute.
16:40:08,962 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@77a4bac - 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 ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@77a4bac - 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.logback.core.rolling.SizeAndTimeBasedFNATP@77a4bac - Roll-over every minute.
16:40:08,966 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@77a4bac - 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.qos.logback.core.rolling.helper.SizeAndTimeBasedArchiveRemover@96be1ae - first clean up after appender initialization
16:40:08,979 |-INFO in ch.qos.logback.core.rolling.helper.SizeAndTimeBasedArchiveRemover@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]

Edit 编辑

Logs get printed on the console after removing this line logger.setAdditive(false); 删除此行logger.setAdditive(false);后,日志将打印在控制台上logger.setAdditive(false); . However, I can't see the file getting created. 但是,我看不到文件正在创建。

It seems like there is some issue with the way you are building appender in appender factory. 看来在appender工厂中构建Appender的方式存在一些问题。 Not sure, what is the exact issue, but i tried below code and it worked. 不知道,确切的问题是什么,但是我尝试了下面的代码,它起作用了。 ` `

sa.setAppenderFactory(new AppenderFactory() { sa.setAppenderFactory(new 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;
                 }
             });

` `

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM