java - SLF4J和Logback : Propagate logger to autowired services

标签 java spring logback slf4j autowired

我对日志记录有点陌生,我已经开始了一个项目,并选择了 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)的 Autowiring 依赖项,但没有为其定义附加程序。 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:我试图找到以前的答案,但我不知道我是否使用了错误的关键字进行搜索,或者是否无法完成。

最佳答案

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

  • 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) {

关于java - SLF4J和Logback : Propagate logger to autowired services,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38550126/

相关文章:

java - 批处理文件错误 - 线程 "main"中出现异常,但无需批处理文件即可编译并正常运行

java - 一个 Java 项目中的队列和主题

java - 使用 docker 和 logback 记录到文件

java - Spring - 停止 bean 初始化

java - 如何 "white label" Spring Bean

java - spring-boot - 关闭控制台日志记录

Grails 类 NotFoundException : org. apache.log4j.Logger

java - 尝试在多个 JPanel 中显示图像

java - Android条码(按下“后退”按钮时崩溃)

java - 使用 Java,在同一个 cmd.exe 窗口中运行多个命令