【问题标题】:How does SLF4J support structured logging [closed]SLF4J 如何支持结构化日志记录 [关闭]
【发布时间】:2016-09-22 16:11:32
【问题描述】:

有人知道structured logging 通常是如何用 SLF4J 实现的吗?

是否已经有任何开放源代码可以处理这个问题?

【问题讨论】:

  • 它没有。 SLF4j 是一个 logging facade - 它不记录任何东西。它只是为其他日志框架提供一个通用 API。这有点像问“JDBC 如何处理复合索引?
  • 我是SLF4J的作者。您能解释一下结构化日志记录的含义吗?
  • @Ceki 我相信这种情况下的结构化日志记录意味着在日志输出中添加了额外的 json 字段,例如{"severity":"INFO", "custom-property", "test-value"}

标签: java logging logback slf4j structured-logging


【解决方案1】:

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

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

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"
}

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 仍处于 alpha 阶段...... slf4j 似乎已死
    • Slf4j 状态有点悬。 Ceki(作者)应享有项目权利。看来他保留了未来的专有权,并且个人没有时间致力于该项目。每个人都只是迁移到 Log4j 2。
    • @thg SLF4J 似乎远未死去。他们不仅在上个月发布了 v2.0.0alpha2,而且还相当频繁地发布了 SLF4J 1.7 的更新。而且,SLF4J 只是一个简单的日志外观。
    • @RAM 问题是 slf4j 如何支持结构化日志记录。如果是门面也没关系。同样在上个月的最新更新之前,该项目已经闲置了 18 个月,业主根本没有任何回应。
    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-01-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-03-24
            • 2012-08-26
            • 2011-11-07
            • 1970-01-01
            相关资源
            最近更新 更多