在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。
默认情况下,感谢任何人。