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

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

(对于层次结构中的其他类以及绑定(bind)到该设备的其他类也是如此)这将允许配置 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 ( Mapped Diagnostic Context ) (*)

设置DynamicThresholdFilter

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

关于java - 如何设置每个实例和每个包层次结构的日志级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28217402/

相关文章:

java - sysout 重定向到 swing 控制台,log4j 内容不会

java - 永久关闭 log4j

java - 使用 shiro 1.2.1 对数据库进行身份验证

java - 如何使用 Google Guava 字典按对象字段迭代对象列表?

bash - 用不同的颜色显示多个文件?

Linux grep 和排序日志文件

java - 如何使用 Log4j 使用 simpledb 附加程序

java - 让 Sprite 像时钟指针一样旋转?

java - 如何将数据写入 csv 文件中的单独列

java - Java Web 应用程序中的异常处理