Java 如何手动创建筛选追加器

Java 如何手动创建筛选追加器,java,logback,Java,Logback,我想手动管理logback配置——特别是在必要时,我想创建一个新的具有FileAppender的筛选Appender 我试图创建所有对象,以便复制我以前使用过的相同XML配置。不幸的是,我不明白如何将fileappender附加到siftappender 以下是我使用的代码: LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory(); PatternLayoutEncoder encoder

我想手动管理logback配置——特别是在必要时,我想创建一个新的具有FileAppender的筛选Appender

我试图创建所有对象,以便复制我以前使用过的相同XML配置。不幸的是,我不明白如何将fileappender附加到siftappender

以下是我使用的代码:

LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();

PatternLayoutEncoder encoder = new PatternLayoutEncoder();
encoder.setContext(loggerContext);
encoder.setPattern("<%d(yyyy-MM-dd HH:mm:ss)> | %.-1level | %msg %n");
encoder.start();

FileAppender<ILoggingEvent> fAppender = new FileAppender<ILoggingEvent>();
fAppender.setContext(loggerContext);
fAppender.setName(application + "_" + user);
fAppender.setFile(logUser);
fAppender.setAppend(true);
fAppender.setEncoder(encoder);
fAppender.start();

MDCBasedDiscriminator discriminator = new MDCBasedDiscriminator();
discriminator.setKey("userid");
discriminator.setDefaultValue("unknown");
discriminator.start();

LevelFilter lFilter = new LevelFilter();
lFilter.setLevel(Level.INFO);
lFilter.start();

// **HOW TO ATTACH fAppender on sAppender ????**
SiftingAppender sAppender = new SiftingAppender();
sAppender.setContext(loggerContext);
sAppender.setName(application + "_" + user + "_SIFTING");
sAppender.addFilter(lFilter);
sAppender.setDiscriminator(discriminator);
sAppender.start();

Logger logger = loggerContext.getLogger("test.mypackage");
logger.setAdditive(false);
logger.setLevel(Level.ALL);
logger.addAppender(sAppender);
LoggerContext LoggerContext=(LoggerContext)LoggerFactory.getILoggerFactory();
PatternLayoutCoder编码器=新PatternLayoutCoder();
编码器.setContext(loggerContext);
编码器.setPattern(“%d(yyyy-MM-dd HH:MM:ss)|%.-1级别|%msg%n”);
encoder.start();
FileAppender fAppender=新FileAppender();
setContext(loggerContext);
fAppender.setName(应用程序+用户);
fAppender.setFile(logUser);
fAppender.setAppend(true);
设置编码器(编码器);
fAppender.start();
MDCBasedScriminator鉴别器=新的MDCBasedScriminator();
discriminator.setKey(“userid”);
鉴别器。setDefaultValue(“未知”);
discriminator.start();
LevelFilter lFilter=新的LevelFilter();
lFilter.setLevel(Level.INFO);
lFilter.start();
//**如何在sAppender上安装fAppender**
SiftingAppender sapender=新的SiftingAppender();
sAppender.setContext(loggerContext);
sAppender.setName(应用程序+“”+用户+“_筛选”);
sAppender.addFilter(lFilter);
sAppender.setDiscriminator(鉴别器);
sapender.start();
Logger=loggerContext.getLogger(“test.mypackage”);
logger.setaddition(假);
logger.setLevel(Level.ALL);
记录器。添加器(sAppender);

您必须创建一个appenderFactory并将此工厂添加到筛选Appender:

    SiftingAppender siftAppender = new SiftingAppender();

    AppenderFactory<ILoggingEvent> appenderFactory = new AppenderFactory<ILoggingEvent>() {

        @Override
        public Appender<ILoggingEvent> buildAppender(Context context, String discriminatingValue) throws JoranException {
            /* Create your file appender here, with what ever options you need */

            PatternLayoutEncoder ple = new PatternLayoutEncoder();
            ple.setPattern("%date %level [%thread] %logger{10} [%file:%line] %msg%n");
            ple.setContext(context);
            ple.start();
            FileAppender<ILoggingEvent> fileAppender = new FileAppender<ILoggingEvent>();
            fileAppender.setFile(file);
            fileAppender.setEncoder(ple);
            fileAppender.setContext(context);
            fileAppender.start();

            return fileAppender;
        }
    };

    /* set your factory to the sifting appender */
    siftAppender.setAppenderFactory(appenderFactory );
    siftAppender.setContext(context);
    siftAppender.setName("TMP");
    siftAppender.start();

    logger.addAppender(siftAppender);
    logger.setAdditive(true);
SiftingAppender siftAppender=新的SiftingAppender();
AppenderFactory AppenderFactory=新AppenderFactory(){
@凌驾
公共Appender buildAppender(上下文上下文,字符串判别值)抛出JoranException{
/*在这里创建您的文件附加器,使用您需要的任何选项*/
PatternLayoutCoder ple=新的PatternLayoutCoder();
setPattern(“%date%级别[%thread]%logger{10}[%file:%line]%msg%n”);
ple.setContext(context);
ple.start();
FileAppender FileAppender=新FileAppender();
fileAppender.setFile(文件);
fileAppender.setEncoder(ple);
setContext(context);
fileAppender.start();
返回文件追加器;
}
};
/*将工厂设置为筛选附加器*/
siftAppender.setAppenderFactory(appenderFactory);
siftapender.setContext(context);
siftAppender.setName(“TMP”);
siftapender.start();
记录器.附加器(siftAppender);
logger.setaddition(真);

您找到解决方案了吗?如果是,请用您使用的代码添加答案?谢谢。我问切基,但他没有回答:(