我正在使用Microsoft.Extensions.Logging以便将日志消息写入AWS Cloudwatch。
此设置如下:
Program.cs
var hostBuilder = new HostBuilder()
.ConfigureHostConfiguration(configHost =>
{
configHost.SetBasePath(Directory.GetCurrentDirectory());
})
.ConfigureAppConfiguration((hostContext, configApp) =>
{
hostContext.HostingEnvironment.ApplicationName = System.Reflection.Assembly.GetExecutingAssembly().FullName.Split(',')[0];
configApp.AddJsonFile("appsettings.json", optional: false);
configApp.AddJsonFile("appsettings.development.json", optional: true);
})
.ConfigureLogging((hostContext, configLogging) =>
{
configLogging.AddConfiguration(hostContext.Configuration.GetSection("Logging"));
configLogging.AddConsole();
configLogging.AddDebug();
if (useCloudWatchLogs)
configLogging.AddAWSProvider(hostContext.Configuration.GetAWSLoggingConfigSection());
configLogging.SetMinimumLevel(LogLevel.Debug);
});
我对日志记录的调用(注入到其他类中)如下:
_log.LogInformation("Subscription Created. ID: " + subscriptionId);
当我在Cloudwatch中查看日志时,我完全按照对LogInformation()的调用获得了单行字符串。
我想记录为结构化JSON对象的内容,如下所示:
{
"timestamp": "2019-09-13T16:10:03.488399Z",
"level": "INFO",
"pid": 1,
"thread_id": 140388289685248,
"message": "Creating a Kafka consumer with params: {'bootstrap.servers': 'myservers', 'security.protocol': 'PLAINTEXT', 'group.id': 'my-group', 'auto.offset.reset': 'earliest'}"
}
除消息外,其他所有操作均由格式化程序完成。该消息就是从调用传递到日志的任何内容。
任何人都可以告诉我如何实现这一目标(或是否有可能?)
我正在使用.Net Core中的Microsoft.Extensions.Logging。也使用
答案 0 :(得分:0)
绝对。您甚至可以filter进行分析。
当您致电LogInformation
时,只需传递序列化并格式化的JSON,您就可以使用了。
一种好的方法是创建一个对象来执行日志记录逻辑,而不是将其放入主对象中,然后将其传递到LogInformation
中。
答案 1 :(得分:0)
添加自定义格式器使我可以执行此操作。代码变为:
Func<LogLevel, object, Exception, string> logFormatter = (a, b, c) => "{\"Hello from\":\"GinjaNinja\"}";
然后在管道中
configLogging.AddAWSProvider(hostContext.Configuration.GetAWSLoggingConfigSection(), formatter:logFormatter);