有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java logback以编程方式获取ref appender

使用此日志文件配置

<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>build/test.log</file>
    <append>false</append>
    <encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
        <providers>
            <timestamp/>
            <arguments/>
            <version/>
            <loggerName/>
            <logLevel/>
            <logLevelValue/>
            <stackTrace/>
            <message/>
            <threadName/>
            <provider class="com.tesco.utils.CorrelatedProvider"/>
        </providers>
    </encoder>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>build/test_%d{yyyy-MM-dd}.%i.log</fileNamePattern>
        <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
            <maxFileSize>1MB</maxFileSize>
        </timeBasedFileNamingAndTriggeringPolicy>
        <!-- keep 30 days' worth of history -->
        <maxHistory>30</maxHistory>
    </rollingPolicy>
</appender>

<appender name="ASYNC_FILE" class="ch.qos.logback.classic.AsyncAppender">
    <appender-ref ref="FILE"/>
</appender>

<root level="INFO">
    <appender-ref ref="ASYNC_FILE"/>
</root>

我正在尝试获取appender文件,但目前唯一可以获取的是ASYNC_文件。如何获取异步_文件的ref appender?。 下面是我迄今为止所做的代码:

  RollingFileAppender<ILoggingEvent> rollingFileAppender = new RollingFileAppender<>();
        LoggerContext context = (LoggerContext)LoggerFactory.getILoggerFactory();
        for (Logger logger : context.getLoggerList()) {
            for (Iterator<Appender<ILoggingEvent>> index = logger.iteratorForAppenders(); index.hasNext();) {
                Appender<ILoggingEvent> appender = index.next();
                if(appender.getName().equals("ASYNC_FILE")){
                    //How can I get the reference appender FILE?
                    rollingFileAppender = (RollingFileAppender<ILoggingEvent>) appender;
                }
            }
        }

解决方案 我忘了将appender转换为AsyncAppender,这就是为什么子appender没有公开

   RollingFileAppender<ILoggingEvent> rollingFileAppender = new RollingFileAppender<>();
        LoggerContext context = (LoggerContext)LoggerFactory.getILoggerFactory();
        for (Logger logger : context.getLoggerList()) {
            for (Iterator<Appender<ILoggingEvent>> index = logger.iteratorForAppenders(); index.hasNext();) {
                Appender<ILoggingEvent> appender = index.next();
                if(appender.getName().equals("ASYNC_TIMING_LOG")){
                    AsyncAppender asyncAppender = (AsyncAppender) appender;
                    rollingFileAppender = (RollingFileAppender<ILoggingEvent>) asyncAppender.getAppender("TIMING_LOG");
                }
            }
        }

共 (1) 个答案

  1. # 1 楼答案

    我忘了将appender转换为AsyncAppender,这就是为什么子appender没有公开

       RollingFileAppender<ILoggingEvent> rollingFileAppender = new RollingFileAppender<>();
        LoggerContext context = (LoggerContext)LoggerFactory.getILoggerFactory();
        for (Logger logger : context.getLoggerList()) {
            for (Iterator<Appender<ILoggingEvent>> index = logger.iteratorForAppenders(); index.hasNext();) {
                Appender<ILoggingEvent> appender = index.next();
                if(appender.getName().equals("ASYNC_TIMING_LOG")){
                    AsyncAppender asyncAppender = (AsyncAppender) appender;
                    rollingFileAppender = (RollingFileAppender<ILoggingEvent>) asyncAppender.getAppender("TIMING_LOG");
                }
            }
        }