如何解决Serilog- 将“严重性”属性添加到 GKE 的 LogEvent 的顶级?
我在 GKE 的 .NET Core 应用中使用带有 Serilog.Formatting.Json.JsonFormatter
格式化程序的 Serilog。我正在登录控制台,由 GKE Logging 代理读取。 GKE 日志代理需要日志事件的顶级的“严重性”属性:GCP Cloud Logging LogEntry docs
因此,我的所有日志都以严重性“信息”显示在 GCP 日志记录中,因为 Serilog Level
位于 GCP 中 LogEntry 的 jsonPayload
属性中。以下是 Cloud Logging 中的 LogEntry 示例:
{
insertId: "1cu507tg3by7sr1"
jsonPayload: {
Properties: {
SpanId: "|a85df301-4585ee48ea1bc1d1."
ParentId: ""
ConnectionId: "0HM64G0TCF3RI"
RequestPath: "/health/live"
RequestId: "0HM64G0TCF3RI:00000001"
TraceId: "a85df301-4585ee48ea1bc1d1"
SourceContext: "CorrelationId.CorrelationIdMiddleware"
EventId: {2}
}
Level: "Information"
Timestamp: "2021-02-03T17:40:28.9343987+00:00"
MessageTemplate: "No correlation ID was found in the request headers"
}
resource: {2}
timestamp: "2021-02-03T17:40:28.934566174Z"
severity: "INFO"
labels: {3}
logName: "projects/ah-cxp-common-gke-np-946/logs/stdout"
receiveTimestamp: "2021-02-03T17:40:32.020942737Z"
}
我的第一个想法是使用 Enricher 添加“严重性”属性:
class SeverityEnricher : ILogEventEnricher
{
public void Enrich(LogEvent logEvent,ILogEventPropertyFactory propertyFactory)
{
logEvent.AddOrUpdateProperty(
propertyFactory.CreateProperty("Severity",LogEventLevel.Error));
}
}
生成的日志在 GCP 中看起来是这样的,并且仍然标记为 Info:
{
insertId: "wqxvyhg43lbwf2"
jsonPayload: {
MessageTemplate: "test error!"
Level: "Error"
Properties: {
severity: "Error"
}
Timestamp: "2021-02-03T18:25:32.6238842+00:00"
}
resource: {2}
timestamp: "2021-02-03T18:25:32.623981268Z"
severity: "INFO"
labels: {3}
logName: "projects/ah-cxp-common-gke-np-946/logs/stdout"
receiveTimestamp: "2021-02-03T18:25:41.029632785Z"
}
在 Serilog 中有什么方法可以在与“jsonPayload”相同的级别而不是在里面添加“severity”属性?我怀疑 GCP 会选择它并适当地记录错误类型。
作为最后的手段,我可能可以使用 GCP 日志接收器,但我当前的设置使用现有的 GKE 日志代理更加方便和高效。
这是一篇相关的 Stack Overflow 帖子,除了我已有的信息或建议,还不足以解决这个问题:https://stackoverflow.com/questions/57215700
解决方法
我发现以下信息详细说明了每个 SeriLog 到 Stackdriver 日志级别的严重性,下表也可能对您有所帮助
Serilog | Stackdriver |
---|---|
详细 | 调试 |
调试 | 调试 |
信息 | 信息 |
警告 | 警告 |
错误 | 错误 |
致命 | 关键 |
完整信息可以在以下链接中找到
https://github.com/manigandham/serilog-sinks-googlecloudlogging#log-level-mapping
我认为这段代码可以帮助您让 Stackdriver 识别 SeriLogs 给出的日志的严重性。
private static LogSeverity TranslateSeverity(LogEventLevel level) => level switch
{
LogEventLevel.Verbose => LogSeverity.Debug,LogEventLevel.Debug => LogSeverity.Debug,LogEventLevel.Information => LogSeverity.Info,LogEventLevel.Warning => LogSeverity.Warning,LogEventLevel.Error => LogSeverity.Error,LogEventLevel.Fatal => LogSeverity.Critical,_ => LogSeverity.Default
};
我会在这里留下完整代码的链接
您好!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。