【问题标题】:SLF4J and Logback: Propagate logger to autowired servicesSLF4J 和 Logback:将记录器传播到自动装配的服务
【发布时间】:2016-07-24 08:29:31
【问题描述】:

我是 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)的自动关联依赖关系,没有为其定义附加程序。 Tee 服务位于 com.foo.tee

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

有没有办法将 Tee 服务记录到 Boo 或 Bar 附加程序,具体取决于哪个服务(Boo / Bar)调用了这个服务?

基本上我想要达到的是

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

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

谢谢!

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

【问题讨论】:

  • 不太确定发生了什么,但是如果你将 lombok 安装到你的项目中,你所要做的就是用 @Slf4j 注释类。调查一下,祝你好运。
  • @Sarief 有点矫枉过正,因为它只替换了一行private final Logger log = LoggerFactory.getLogger(getClass())
  • @OrangeDog 也许,但对我来说就像:安装和使用。也不需要这条线,因为我认为它是矫枉过正的:D
  • 服务“Tee”具有正确的私有最终 Logger log = LoggerFactory.getLogger(Tee.class),但由于某种原因,来自 Tee 的日志记录未包含在 Bar 或 Boo 日志中。这就是我想要完成的事情

标签: java spring logback slf4j autowired


【解决方案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) {

【讨论】:

  • 所以,Logback 无法根据谁调用 Tee 来确定要使用的记录器,对吧?在这种情况下,如果 Boo 调用 Tee,则 Tee 日志将输出到 Bar 日志。
  • 这里使用的记录器是您使用的记录器。任何地方都没有魔法。
  • 谢谢@OrangeDog,我只是想找出存在魔法的ID,因为我对日志框架有点陌生,这样的东西对我来说非常有用。我已经计划使用您的建议,但想知道是否有什么可以避免的。谢谢!
猜你喜欢
  • 2020-08-07
  • 2015-08-13
  • 1970-01-01
  • 1970-01-01
  • 2017-05-06
  • 2011-04-04
  • 2021-12-18
  • 2014-10-20
  • 1970-01-01
相关资源
最近更新 更多