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

时间:2015-01-29 14:41:38

标签: java logging log4j slf4j

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

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

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

到目前为止我的想法:

目前我的记录器已经创建了"标准"方式,按类类型

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);
    ...
  }
  ...
}

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

log4j.logger.mydevice123=DEBUG

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

  • mydevice123.com.example.dev.Thermometer.class
  • mydevice123.com.example.dev.AnalogDevice.class
  • mydevice123.com.example.dev.SomeOtherDeviceSpecific.class
  • ...

此外,我现在失去了在包层次结构上设置级别的可能性。这已经不再适用了。

log4j.logger.com.example.dev=DEBUG

什么是更好的方式?

1 个答案:

答案 0 :(得分:1)

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

在MDC(Mapped Diagnostic Context)(*)

中设置您的设备ID

设置DynamicThresholdFilter

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

之后将其删除