如何在不预先格式化的情况下将日志从 docker 容器转发到 Graylog 服务器?

How to forward logs from docker container to Graylog server without pre-formatting?

我有一个 Docker 容器,它通过 udp 将其日志发送到 Graylog。 以前我只是用它来输出原始消息,但现在我想出了一个以 GELF 格式记录日志的解决方案。 但是,Docker 只是将其放入“消息”字段(来自 Graylog Web 界面的屏幕):

或纯文本:

{
   "version":"1.1",
   "host":"1eefd38079fa",
   "short_message":"Content root path: /app",
   "full_message":"Content root path: /app",
   "timestamp":1633754884.93817,
   "level":6,
   "_contentRoot":"/app",
   "_LoggerName":"Microsoft.Hosting.Lifetime",
   "_threadid":"1",
   "_date":"09-10-2021 04:48:04,938",
   "_level":"INFO",
   "_callsite":"Microsoft.Extensions.Hosting.Internal.ConsoleLifetime.OnApplicationStarted"
}

GELF-driver 在docker-compose 文件中配置:

logging:
  driver: "gelf"
  options:
    gelf-address: "udp://sample-ip:port"

如何让Docker只转发这些已经格式化的日志? 有什么方法可以处理这些日志并将它们作为自定义字段附加到 docker 日志中吗? 完美的解决方案是以某种方式启用 gelf 日志驱动程序,但禁用预处理/格式化,因为日志已经是 GELF。

PS。对于日志,我使用的是 NLog 库、C# .NET 5 及其 NuGet 包 https://github.com/farzadpanahi/NLog.GelfLayout

就我而言,根本不需要使用 NLog。它只是一个没有人试图深入研究的日志框架。

因此,更好的选择是为 Microsoft.Extensions.Logging 使用 GELF 记录器提供程序:Gelf.Extensions.Logging - https://github.com/mattwcole/gelf-extensions-logging 如果启用了 docker 容器,请不要忘记禁用 GELF。

它支持附加字段、格式化字符串的参数化(大括号 {} 中的参数成为 graylog 字段)并且可以通过 appsettings.json

轻松配置

有些人可能认为这不是一个答案,因为我使用的是 NLog,但对我来说 -- 这是一种发送自定义日志的好方法,而且没有太多麻烦。至于NLog,我想不出解决方案。