任何人都知道SLF4J通常如何实现structured logging?
有没有任何开源处理这个?
答案 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
实现。希望它会对你有所帮助。
要获得更多学习,您可以阅读本教程。
答案 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)的支持:
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.");