SLF4J 和 Logback:将记录器传播到自动装配的服务

SLF4J and Logback: Propagate logger to autowired services

我是 Logging 的新手,我已经开始了一个我选择了 Logback 的项目。

我有以下logback.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <appender name="BARLOGGER" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME:-/repository/logs}/bar.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME:-/repository/logs}/bar.%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <appender name="BOOLOGGER" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME:-/repository/logs}/boo.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME:-/repository/logs}/boo.%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <logger name="com.foo.bar" level="debug" additivity="false">
        <appender-ref ref="BARLOGGER" />
    </logger>

    <logger name="com.foo.boo" level="debug" additivity="false">
        <appender-ref ref="BOOLOGGER" />
    </logger>

    <root level="error">
        <appender-ref ref="STDOUT" />
    </root>

</configuration>

我有 2 项服务(BooBar),在两个不同的包中。我已经为他们每个人配置了一个附加程序,并且这些服务的日志记录工作正常。

这就是我面临的问题。

两个服务(BooBar)都具有第三个服务(Tee)的自动装配依赖性,没有为其定义 appender。 Tee 服务位于 com.foo.tee

我不希望这 3 个服务有一个唯一的日志,因为它们做不同的事情并且 运行 在不同的时间。

有没有办法根据哪个服务 (Boo / Bar) 调用此服务,将 Tee 服务日志记录到 Boo 或 Bar 附加程序?

基本上我要实现的是

我希望它具有正在执行的操作的上下文,因为 Tee 有第三个日志文件使得很难追踪调用的来源。

谢谢!

PS: 我试图找到以前的答案,但我不知道我是否用错误的关键字搜索或无法完成。

所以你已经配置了三个记录器

  • com.foo.bar
  • com.foo.boo

如果您想要一些 class 不在 bar/boo 包中的东西来使用 bar/boo 记录器,那么您将不需要使用它自己的记录器。

class Tee {
    private final Logger log = LoggerFactory.getLogger(Bar.class);

另请注意,记录器名称实际上不需要实际对应任何包或 class 名称。

如果您希望记录器依赖于调用者,那么调用应该包含一个记录器。

class Tee {
    public void doSomething(Logger log) {