【问题标题】:How to obtain an OutputStream reference from an slf4j logger?如何从 slf4j 记录器获取 OutputStream 引用?
【发布时间】:2017-10-13 04:34:58
【问题描述】:

我在 slf4j 后面使用 logback,想知道如何从 org.slf4j.Logger 实例获取 OutputStream 引用。用例是 Shrinkwrap 的 Archive.writeTo(OutputStream, ...) 方法。

我知道可以通过创建ByteArrayOutputStream、传递它并将其内容写入记录器来解决此引用的需要。我知道stdout and stderr can be redirected to a logger in general。话虽如此,我正在寻找这个问题的直接答案。如果没有,我会建议在 slf4j 中添加一个机制。

我正在使用 slf4j API 1.7.5 和 logback 1.2.2。

【问题讨论】:

  • 我认为添加一个接受大量二进制数据而没有日志级别和明确消息分界的 API 是没有意义的。作为一个想要记录消息的应用程序,由您来生成有意义的、单独的日志消息(每个都有一个级别、一个“正常大小”的消息,可能还有一些映射的上下文属性)。 OutputStream 只是二进制数据的哑接收器。
  • jira.qos.ch/browse/LBCLASSIC-118 建议提供 OutputStream 引用作为 Logger.[level] 的参数
  • 不过,这需要按照您的建议工作:您将从记录器中获得一个 OutputStream。如果您将 OutputStream 传递给记录器,它所能做的就是写入它。无法从 OutputStream 中读取。

标签: logging slf4j


【解决方案1】:

假设这仍然是面向行的文本数据 (*),您可以提供一个 OutputStream 实现,将您写入其中的任何内容转发到 Logger 实例。您需要一些方法来确定单个消息的开始和结束位置。您甚至可以查看内容并分配日志级别等。

(*) 如果不是,将其发送到日志框架似乎没有多大意义。

【讨论】:

  • 不过,这与您不喜欢的解决方法(或链接线程 stackoverflow.com/a/11187462/14955 上的此答案)非常相似。
  • 现在我明白了...因为OutputStream.write 只有一个int 参数,并且没有其他方法需要子类处理转换为面向行的数据。
  • @ClaudeBrisson 没有问题,也没有迹象表明答案(我标记为正确)或对话中有一个。请澄清。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-27
  • 2012-10-08
  • 2010-11-18
  • 2020-08-18
  • 2021-06-17
  • 2011-01-23
  • 2016-11-04
相关资源
最近更新 更多