首页 > 解决方案 > 如何为特定领域的属性扩展 Flogger fluent API?

问题描述

假设在我的域中,每个日志语句都出现在 Web 请求的上下文中,并且每个请求都有用户 ID、会话 ID 和购物车 ID 的上下文。

而不是记录如下内容:

logger.atInfo().log("User %s (session: %s) added product %s to cart %s.", userId, sessionId, productId, cartId);

我更喜欢类似以下结构的东西:

logger.atInfo().forUser(userId).withSession(sessionId).withCart(cartId).log("product added to cart: %s", productId);

或者更好

logger.atInfo().forUser(userId).withSession(sessionId).withCart(cartId).product(productId).action(PRODUCT_ADDED).log();

https://google.github.io/flogger/benefits#extensibility似乎暗示这是可能的,但我看不出在哪里。

我希望我的日志记录后端可以将此信息的 JSON 序列化发送到我的 ELK 堆栈。

标签: javalogging

解决方案


您创建了一个新类(例如UserLogger),它扩展了 Logger 并实现了您的方法,并使用该类实例化了您的 logger。

public class UserLogger extends FluentLogger {

  public UserLogger forUser(Object userId) {
    return super.log("User %s");
  }
...
}

推荐阅读