16

任何人都知道通常如何使用 SLF4J 实现结构化日志记录?

是否有任何开源已经在那里处理这个?

4

6 回答 6

12

如果您将 SLF4J 与 Logback 和 Logstash 结合使用,则支持结构化日志记录StructuredArguments您可以在 Github 上的 logstash logback 编码器页面上找到有关此的文档。

一个简单的例子来说明它是如何工作的。这个日志行..

log.debug("Retrieved file {}", StructuredArguments.value("filename", upload.getOriginalFilename()))

..产生以下日志 json 输出:

{
  "filename": "simple.zip",
  "@timestamp": "2019-02-12T14:31:31.631+00:00",
  "severity": "DEBUG",
  "service": "upload",
  "thread": "http-nio-9091-exec-1",
  "logger": "some.great.ClassName",
  "message": "Retrieved file simple.zip"
}
于 2019-02-12T14:36:00.960 回答
9

Slf4j 使用 v2.0.0(截至 2019 年 10 月的 Alpha)添加了对结构化日志记录(和流式 API)的支持:

于 2019-11-05T11:09:07.433 回答
4

github 中有一个示例SLF4J,它是使用. 希望它会帮助你。

要了解更多信息,您可以阅读本教程。

  1. 使用 MDC 在 logback 中进行结构化日志记录
  2. 掌握 Java 日志记录
于 2016-05-25T07:55:51.910 回答
2

仅供参考 - 我刚刚为 SLF4J 开源了一个结构化的日志记录包装器。我们在日常工作中使用它来预先登录 Splunk,这是一个很大的改进。也许你会发现它很有用。

https://github.com/Randgalt/maple

您定义一个“模式”,然后包装一个 SLF4J 记录器。例如

public interface LoggingSchema {
    LoggingSchema name(String name);

    LoggingSchema date(Instant date);

    ... etc ...
}    

...

MapleLogger<LoggingSchema> logger = MapleFactory.getLogger(slf4j, LoggingSchema.class);
logger.info("my message", s -> s.name("john doe").date(Instant.now());

生成一个 slf4j 日志 ala:

slf4j.info("my message name=\"john doe\" date=2019-10-08T18:52:15.820177Z");
于 2019-10-08T18:53:38.070 回答
2

对于任何偶然发现这个相当老的问题的人:作为一种替代方法,它比手动将每个参数设置为 MDC 对开发人员更友好,您可以理想地使用像https://github.com/jacek99/structlog4j这样的结构化记录器yaml 或 json 格式化程序。然后很容易将日志提供给 ELK 堆栈,并根据参数查询所有日志(您不必手动创建日志条目解析器,因为所有相关字段都将以结构化形式存在)。或者在 slf4j 之上创建您自己的简单记录器,这将采用任何 varargs 传递该.log方法并自动在 MDC 中创建键值对,然后您可以将其与结构化格式化程序配对,例如,如果您的运行时使用 Logstash:https:/ /github.com/logstash/logstash-logback-encoder#mdc-fields

于 2018-05-11T06:40:13.193 回答
-1

您可以尝试在 Scala 中使用 Logstage https://izumi.7mind.io/latest/release/doc/logstage/index.html

我们有一个有效的 slf4j 适配器,我们为您的日志执行零成本结构。

此外,您可能会发现,尽管更换了 MDC,我们仍有许多优势。对于效果库,我们有 Fiber 和 FiberLocal 的上下文我们有自动结构标识符,以便在结构化数据库中更好地处理

于 2019-03-28T07:54:34.627 回答