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

时间:2016-07-24 08:29:31

标签: java spring logback slf4j autowired

我对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)。我为每个服务器配置了一个appender,这些服务的日志记录工作正常。

这是我面临的问题。

两个服务(BooBar)都具有第三个服务(Tee)的自动连接依赖关系,其中没有定义任何appender。 Tee服务位于com.foo.tee

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

是否有办法将Tee服务日志记录包含在Boo或Bar appender中,具体取决于哪个服务(Boo / Bar)称为此服务?

基本上,我想要实现的是

  • Bar具有Tee依赖关系。如果Bar调用Tee方法,则该方法的日志记录应仅写入Bar logger
  • Boo也有Tee依赖。如果Boo调用Tee方法,则该方法的日志记录应仅写入Boo记录器
  • Bar和Boo日志写入不同的文件,而Tee日志记录只应附加到其“调用者”日志

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

谢谢!

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

1 个答案:

答案 0 :(得分:1)

所以你配置了三个记录器

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

如果您想要某个不在bar / boo包中的课程使用bar / boo记录器,那么您将不需要使用自己的记录器。

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

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

如果您希望记录器依赖于呼叫者,则呼叫应包括记录器。

class Tee {
    public void doSomething(Logger log) {