我对日志记录有点陌生,我已经开始了一个项目,并选择了 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 个服务(Boo
和 Bar
),位于两个不同的包中。我已经为每个服务配置了一个附加程序,并且这些服务的日志记录工作正常。
这就是我面临的问题。
两个服务(Boo
和 Bar
)都具有第三个服务(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/