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

SP *_*Wit 5 logging azure serilog azure-application-insights asp.net-core

我目前正在使用 Serilog 实现 Azure Application Insights 日志记录,除非我在 Serilog 配置中使用输出模板,否则该日志记录工作正常。将 Serilog 数据传递给应用程序洞察时,模板似乎被忽略了。

我在 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"
    }
  },
Run Code Online (Sandbox Code Playgroud)

日志记录语句:

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

应用程序洞察中的输出:

在此输入图像描述

这是为应用程序见解自定义错误消息的正确方法吗?

Tao*_*hou 5

检查serilog-sinks-applicationinsights的源代码后,你会发现它没有读取outputTemplatefrom appsetting.json

对于解决方法,您可以实施自定义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);
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  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"
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)