我目前正在使用 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"
}
},
日志记录语句:
logger.Error("测试 AI 的 Serilog 错误 - "+ DateTime.Now);
应用程序洞察中的输出:
这是为应用程序见解自定义错误消息的正确方法吗?
最佳答案
查看源码后serilog-sinks-applicationinsights ,你会发现它没有从appsetting.json
读取outputTemplate
。
要解决此问题,您可以实现自定义 TemplateTraceTelemetryConverter
。
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); } }
使用
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" } }
关于azure - 将 Serilog 中的 outputTemplate 参数与 Azure Application Insights 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57183780/