使用SLF4J时日志消息的ID

时间:2013-11-15 17:02:32

标签: java logging slf4j

我想为日志语句添加唯一标识符,因此我可以在每个日志语句中添加文档(外部,例如wiki),因此用户可以使用id快速访问与消息相关的文档。我想使用的日志框架是SLF4J / logback。

除了有关审计框架的一些内容之外,我无法找到有关相关方法的文档。

我认为Marker概念可用于ID注入,或者我可以将ID添加到消息文本本身。

如何以“正确的方式”向日志记录语句添加ID?我有没有想到的可能性?

修改

术语唯一ID 只是声明 应该是每个日志语句的标识符。开发者,例如将这样的ID添加到表/枚举/手动,这可能是错误的。 这样的ID必须是稳定的,因此文档可以基于它。所以ID本身并不是我想知道的。

我的问题是:将ID与消息文本一起推送到记录器的正确方法是什么?标记是否适合这种要求,我应该将ID嵌入到消息文本中还是有其他可能性?

所以,基本上,我会使用

logger.info(IDMarkers.DB_CONNECTION_FAILED, "no connection to the database");

或者只是

logger.info("[{}] no connection to the database", LogIDs.DB_CONNECTION_FAILED);

第一种方法的优点是显示ID取决于日志系统/其配置。

2 个答案:

答案 0 :(得分:1)

Slf4j有http://www.slf4j.org/apidocs/org/slf4j/Marker.html

不幸的是,Marker的广告目的不同。仍然可以使用它们来唯一标记日志记录语句。

更麻烦的解决方案是MDC:

MDC.put("MsgId", "EV-1234");
log.info()
MDC.remove("MsgId");

或使用结构日志记录(需要v2.0.0):

logger.atDebug()
    .addKeyValue("MsgId", "EV-1234")
    .log("Temperature changed.");          

答案 1 :(得分:0)

唯一在某个范围内是唯一的。最终,甚至会使用每个intlong值。

所以想想“独特性”对你意味着什么。然后使用一个包装器,确保使用插入的id处理日志记录。

请注意,对于slf4j,您正在处理interface,这将使许多日志API 一致。这意味着您可能无法选择子类甚至注入接口实现以确保一致的日志记录。因此,您将受限于包装日志记录API等技术(最好通过“一致”接口)。

package mypackage.log;

public class LoggerWrapper implements org.log4j.Logger {

   private org.log4j.Logger logger;

   public LoggerWrapper(org.log4j.Logger logger) {
     this.logger = logger;
   }

   public String getUniqueId() {
     return ...;
   }

   public void info(String message, Object params...) {
     logger.info(String.format("[%d] %s", getUniqueId(), message), params));
   }

   ... implement all the other methods ...
}

这意味着您还必须制作自己的LoggerFactory界面

public Logger getLogger(String name) {
  return new LoggerWrapper(org.sql4j.LoggerFactory(name));
}

虽然上面的代码有一些瑕疵(实际上没有测试它);希望它会给你一个想法。

相关问题