【发布时间】:2021-05-13 14:37:00
【问题描述】:
我们使用的是 Serilog,但 docker 运行时对标准输出的日志有 16k 的限制。如此大的日志被写在多行上。 FluentD 然后将每一行作为单独的日志读取。这是一个已知的issue。
Serilog 有什么方法可以检测到较大的日志消息,然后将其拆分为低于限制的较小日志?
【问题讨论】:
我们使用的是 Serilog,但 docker 运行时对标准输出的日志有 16k 的限制。如此大的日志被写在多行上。 FluentD 然后将每一行作为单独的日志读取。这是一个已知的issue。
Serilog 有什么方法可以检测到较大的日志消息,然后将其拆分为低于限制的较小日志?
【问题讨论】:
使用您将日志传输到的自定义接收器实现似乎可以实现您想要做的事情。 Serilog 的工作方式是,您可以“链接”多个接收器,以便日志条目从一个流向另一个,就像在管道中一样。
您可以创建一个自定义接收器实现来检查日志事件的大小,并在达到阈值时将其拆分为多个要记录的事件。然后,在最后一个接收器(将日志事件推送到日志聚合器的接收器)之前添加这个新接收器。
我认为 Serilog 没有任何东西可以开箱即用地做到这一点。您需要自己定义约束和拆分事件的逻辑(如何处理属性等)。
如果某个特定属性给您带来麻烦,那么逻辑会更简单,因为您可以只拆分该单个属性并生成多个克隆事件(所有其他属性保持不变),然后将有问题的消息的部分按顺序传递给它们.
或者,如果导致问题的属性与您不太相关,您可以在丰富器实现中修剪它们。浓缩器可以检查特定属性并对其进行任何转换。请注意,扩充本身不能拆分事件:它是一种扩充现有日志条目的机制。
【讨论】: