繁体   English   中英

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

[英]How to set log level per instance and per package hierarchy

我的应用程序管理网络中的设备。 这些在我的应用程序中由对象和对象组成表示。 这些设备中的每一个都有一个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”的所有消息。

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

有什么更好的方法?

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

在MDC( 映射的诊断上下文 )(*)中设置设备ID

设置一个DynamicThresholdFilter

(*) 恕我直言,在MDC中设置设备ID的一种好方法是使用应用于每个业务方法的方面,该方面将从目标对象中获取设备ID( 例如spring方面 ),在方法调用之前在上下文中设置ID然后将其删除

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM