SLF4J如何支持结构化日志记录

时间:2016-05-25 07:36:49

标签: java logging logback slf4j jul-to-slf4j

任何人都知道SLF4J通常如何实现structured logging

有没有任何开源处理这个?

6 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

如果将SLF4J与Logback结合使用,则StructuredArguments支持结构化日志记录。您可以在logback page on Github上找到有关此文档的文档。

一个简单的例子。此日志行。

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

..产生以下log 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"
}

答案 2 :(得分:1)

github中有an example,使用SLF4J实现。希望它会对你有所帮助。

要获得更多学习,您可以阅读本教程。

  1. Structured logging in logback using MDC
  2. Master Java Logging

答案 3 :(得分:0)

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

我们为slf4j提供了有效的适配器,并且为您的日志执行了零成本的结构。

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

答案 4 :(得分:0)

仅供参考-我刚刚开源了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");

答案 5 :(得分:0)

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