如何使被调用的方法通过logback登录到调用者线程日志文件

在Spring应用程序中使用logback,如果我为A类设置了记录器行为以在子文件夹中登录文件,则B方法(由A调用)中使用的B类记录器将在其他位置记录日志,然后将A的日志文件记录下来。

这里是上下文。我有一个spring应用程序,它创建一个线程池并执行它们。每个线程几乎相同(使用几乎相同的类,但是每个线程执行不同的操作)。我在logback-spring.xml中为“主”应用程序日志设置了常见行为,为所有线程设置了自定义常规行为,并为一个特定线程设置了特定行为(我们称其为“检查线程”),将其日志文件放在另一个文件夹中。

这是logback配置xml:

<WebMethod()>

通常,任何类都使用像这样的私有静态最终Logger:

<configuration>
    <property name="LOG_DIR" value="./logs" />
    <property name="LOG_DIR_ARCHIVE" value="./logs/archive" />
    <property name="LOG_DIR_CHECK" value="./logs/check" />
    <property name="LOG_DIR_CHECK_ARCHIVE" value="./logs/check/archive" />

    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <Pattern>
                %black(%d{ISO8601}) %highlight(%-5level) [%blue(%t)] %blue(%C{1.}): %msg%n%throwable
            </Pattern>
        </layout>
    </appender>

    <appender name="thread-file" class="ch.qos.logback.classic.sift.SiftingAppender">

        <discriminator>
            <key>logFileName</key>
            <defaultvalue>MYAPP_service</defaultvalue>
        </discriminator>

        <sift> 
            <appender name="${logFileName}" class="ch.qos.logback.core.rolling.RollingFileAppender">
                <file>${LOG_DIR}/${logFileName}.log</file>

                <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
                    <Pattern>
                        %d{yyyy-MM-dd HH:mm:ss} [%thread] %level %logger{35} - %msg%n
                    </Pattern>
                </encoder>

                <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">                                         
                    <fileNamePattern>${LOG_DIR_ARCHIVE}/${logFileName}_%d{yyyy-MM-dd}.log.gz</fileNamePattern>
                </rollingPolicy>
            </appender>
        </sift>
    </appender>

    <appender name="check-file" class="ch.qos.logback.classic.sift.SiftingAppender">
        <discriminator>
            <key>logCheckFileName</key>
            <defaultvalue>MY_APP_check_service</defaultvalue>
        </discriminator>
        <sift> 
            <appender name="${logCheckFileName}" class="ch.qos.logback.core.rolling.RollingFileAppender">
                <file>${LOG_DIR_CHECK}/${logCheckFileName}.log</file>

                <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
                    <Pattern>
                        %d{yyyy-MM-dd HH:mm:ss} [%thread] %level %logger{35} - %msg%n
                    </Pattern>
                </encoder>

                <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">                                         
                    <fileNamePattern>${LOG_DIR_CHECK_ARCHIVE}/${logCheckFileName}_%d{yyyy-MM-dd}.log.gz</fileNamePattern>
                </rollingPolicy>
            </appender>
        </sift>

    </appender>

    <root level="info">
        <appender-ref ref="console" />
    </root>

    <logger name="checks" level="debug" additivity="false">
        <appender-ref ref="check-file" />
    </logger>

    <logger name="company.MY_APP.service" level="debug" additivity="false">
        <appender-ref ref="thread-file" />
        <appender-ref ref="console" />
    </logger>
</configuration>

唯一的例外是使用这样的日志的检查线程:

private static final Logger log = LoggerFactory.getLogger(AnyClass.class);

现在,发生的是'main'方法记录在其日志文件('service.log')中,每个线程将整个堆栈写入其自己的文件(thread1.log,thread2.log ecc ...)。因此,当thread1调用另一个类(例如A.class)的方法时,该类将登录thread1.log文件。没关系! 但是,当检查线程调用与A.class相同的方法时,A记录器将登录service.log,而不是我让A登录到check-thread.log。

默认情况下,感谢任何人。

rhrhok 回答:如何使被调用的方法通过logback登录到调用者线程日志文件

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3123625.html

大家都在问