将 Serilog 中的 outputTemplate 参数与 Azure Application Insights 结合使用

Using outputTemplate argument in Serilog with Azure Application Insights

我目前正在使用 Serilog 实现 Azure Application Insights 日志记录,除了我在 Serilog 配置中使用输出模板时,它工作正常。将 Serilog 数据传递给 Application insights 时,模板似乎被忽略了。

我在 appsetting.json 中的 serilog 配置:

"Serilog": {
    "Using": [ "Serilog.Sinks.ApplicationInsights" ],
    "MinimumLevel": "Debug",
    "WriteTo": [
      { "Name": "Console" },
      {
        "Name": "RollingFile",
        "Args": {
          "pathFormat": "logs\log-{Date}.txt",
          "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] {Message}{NewLine}{Exception}"
        }
      },
      {
        "Name": "ApplicationInsights",
        "Args": {
          "restrictedToMinimumLevel": "Information",
          "telemetryConverter": "Serilog.Sinks.ApplicationInsights.Sinks.ApplicationInsights.TelemetryConverters.TraceTelemetryConverter, Serilog.Sinks.ApplicationInsights",
          "outputTemplate": "Test Template - {Message}"
        }
      }
    ],
    "Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId" ],
    "Properties": {
      "Application": "app"
    }
  },

日志语句:

logger.Error("Test Serilog Error For AI - " + DateTime.Now);

应用程序见解中的输出:

这是为 Application insights 自定义错误消息的正确方法吗?

查看源代码serilog-sinks-applicationinsights后,您会发现它并没有从appsetting.json读取outputTemplate

要解决此问题,您可以实施自定义 TemplateTraceTelemetryConverter

  1. TemplateTraceTelemetryConverter

    public class TemplateTraceTelemetryConverter : TraceTelemetryConverter
    {
        public override IEnumerable<ITelemetry> Convert(LogEvent logEvent, IFormatProvider formatProvider)
        {
            var templateParser = new MessageTemplateParser();
            var template = templateParser.Parse($"Test Template - {logEvent.MessageTemplate.Text}");
            LogEvent newLogEvent = new LogEvent(logEvent.Timestamp
                , logEvent.Level
                , logEvent.Exception
                , template
                , logEvent.Properties.Select(p => new LogEventProperty(p.Key, p.Value)));
            return base.Convert(newLogEvent, formatProvider);
        }
    }
    
  2. 使用TemplateTraceTelemetryConverter

    "Serilog": {
        "Using": [
        "Serilog.Sinks.ApplicationInsights",
        ],
        "MinimumLevel": "Debug",
        "WriteTo": [
        {
            "Name": "Console",
            "Args": {
            "outputTemplate": "Test Template - {Message}"
            }
        },
        {
            "Name": "RollingFile",
            "Args": {
            "pathFormat": "logs\log-{Date}.txt",
            "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] {Message}{NewLine}{Exception}"
            }
        },
        {
            "Name": "ApplicationInsights",
            "Args": {
            "restrictedToMinimumLevel": "Error",          
            "telemetryConverter": "YourProjectNamespace.TemplateTraceTelemetryConverter, YourProjectNamespace"
            //"outputTemplate": "Test Template - {Message}"
            }
        }
        ],
        "Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId" ],
        "Properties": {
        "Application": "app"
        }
    }