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 项服务(Boo
和 Bar
),在两个不同的包中。我已经为他们每个人配置了一个附加程序,并且这些服务的日志记录工作正常。
这就是我面临的问题。
两个服务(Boo
和 Bar
)都具有第三个服务(Tee
)的自动装配依赖性,没有为其定义 appender。 Tee
服务位于 com.foo.tee
我不希望这 3 个服务有一个唯一的日志,因为它们做不同的事情并且 运行 在不同的时间。
有没有办法根据哪个服务 (Boo
/ Bar
) 调用此服务,将 Tee
服务日志记录到 Boo 或 Bar 附加程序?
基本上我要实现的是
- Bar 具有 Tee 依赖项。如果 Bar 调用 Tee 方法,该方法的日志记录应该只写入 Bar logger
- Boo 也有一个 Tee 依赖项。如果 Boo 调用 Tee 方法,该方法的日志记录应该只写入 Boo 记录器
- Bar 和 Boo 日志写入不同的文件,Tee 日志记录应该只附加到它的 "invocator" 日志
我希望它具有正在执行的操作的上下文,因为 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) {
我是 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 项服务(Boo
和 Bar
),在两个不同的包中。我已经为他们每个人配置了一个附加程序,并且这些服务的日志记录工作正常。
这就是我面临的问题。
两个服务(Boo
和 Bar
)都具有第三个服务(Tee
)的自动装配依赖性,没有为其定义 appender。 Tee
服务位于 com.foo.tee
我不希望这 3 个服务有一个唯一的日志,因为它们做不同的事情并且 运行 在不同的时间。
有没有办法根据哪个服务 (Boo
/ Bar
) 调用此服务,将 Tee
服务日志记录到 Boo 或 Bar 附加程序?
基本上我要实现的是
- Bar 具有 Tee 依赖项。如果 Bar 调用 Tee 方法,该方法的日志记录应该只写入 Bar logger
- Boo 也有一个 Tee 依赖项。如果 Boo 调用 Tee 方法,该方法的日志记录应该只写入 Boo 记录器
- Bar 和 Boo 日志写入不同的文件,Tee 日志记录应该只附加到它的 "invocator" 日志
我希望它具有正在执行的操作的上下文,因为 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) {