如何设置每个实例和每个包层次结构的日志级别

How to set log level per instance and per package hierarchy

我的应用程序管理网络中的设备。这些在我的应用程序中由对象和对象组合表示。 这些设备中的每一个都有一个 ID,与设备相关的每个对象都知道它的 ID。

配置日志记录时,除了按包层次结构设置日志级别外,我还希望能够按设备设置它——也就是说,与一个设备相关的所有实例都应该是,例如。放入 DEBUG 级别。

如何通过包层次结构和实例 ID 设置日志级别?

到目前为止我的想法:

目前我的记录器是以 "standard" 方式创建的 class 类型

public class Thermometer extends AnalogDevice {
  private static final Logger logger = LoggerFactory.getLogger(Thermometer.class);
  ...
}

但我希望能够为特定设备选择日志级别。我目前的想法是在记录器名称中使用 ID,如下所示:

public class Thermometer extends AnalogDevice {
  private final Logger logger;
  public Thermometer(String deviceId){
    logger = LoggerFactory.getLogger(deviceId+"."+Thermometer.class);
    ...
  }
  ...
}

(对于层次结构中的其他 classes 和绑定到此设备的其他 classes 也是如此)这将允许配置 log4j 以包含设备 "mydevice123" 的所有消息在调试级别。

log4j.logger.mydevice123=DEBUG

但这可能会创建许多记录器(每个设备/每个 class):

我现在也失去了在包层次结构上设置级别的可能性。这将不再起作用。

log4j.logger.com.example.dev=DEBUG

有什么更好的方法?

使用 logback 作为您的日志记录实现。

在 MDC 中设置您的设备 ID (Mapped Diagnostic Context) (*)

设置一个DynamicThresholdFilter

(*) 恕我直言,在 MDC 中设置设备 ID 的一个好方法是使用一个应用于每个业务方法的方面,该方法将从目标对象获取设备 ID (exemple with spring aspects ), 在方法调用之前在上下文中设置 id 并在

之后将其删除