任何人都知道通常如何使用 SLF4J 实现结构化日志记录?
是否有任何开源已经在那里处理这个?
如果您将 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"
}
Slf4j 使用 v2.0.0(截至 2019 年 10 月的 Alpha)添加了对结构化日志记录(和流式 API)的支持:
http://www.slf4j.org/apidocs/org/slf4j/spi/LoggingEventBuilder.html
int newT = 15;
int oldT = 16;
// using classical API
logger.debug("oldT={} newT={} Temperature changed.", newT, oldT);
// using fluent API
logger.atDebug()
.addKeyValue("oldT", oldT)
.addKeyValue("newT", newT)
.log("Temperature changed.");
仅供参考 - 我刚刚为 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");
对于任何偶然发现这个相当老的问题的人:作为一种替代方法,它比手动将每个参数设置为 MDC 对开发人员更友好,您可以理想地使用像https://github.com/jacek99/structlog4j这样的结构化记录器yaml 或 json 格式化程序。然后很容易将日志提供给 ELK 堆栈,并根据参数查询所有日志(您不必手动创建日志条目解析器,因为所有相关字段都将以结构化形式存在)。或者在 slf4j 之上创建您自己的简单记录器,这将采用任何 varargs 传递该.log
方法并自动在 MDC 中创建键值对,然后您可以将其与结构化格式化程序配对,例如,如果您的运行时使用 Logstash:https:/ /github.com/logstash/logstash-logback-encoder#mdc-fields
您可以尝试在 Scala 中使用 Logstage https://izumi.7mind.io/latest/release/doc/logstage/index.html
我们有一个有效的 slf4j 适配器,我们为您的日志执行零成本结构。
此外,您可能会发现,尽管更换了 MDC,我们仍有许多优势。对于效果库,我们有 Fiber 和 FiberLocal 的上下文我们有自动结构标识符,以便在结构化数据库中更好地处理