0

我有一个 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

4

1 回答 1

0

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

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

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

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

于 2022-01-18T19:02:20.477 回答