日志消息的JSON格式
我正在使用Microsoft.Extensions.Logging将日志消息写入AWS Cloudwatch 其设置如下所示: Program.cs日志消息的JSON格式,json,logging,.net-core,amazon-cloudwatch,Json,Logging,.net Core,Amazon Cloudwatch,我正在使用Microsoft.Extensions.Logging将日志消息写入AWS Cloudwatch 其设置如下所示: Program.cs var hostBuilder = new HostBuilder() .ConfigureHostConfiguration(configHost => { configHost.SetBasePath(Directory.GetCurrentD
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。也绝对使用。您甚至可以将其用于分析。 调用
LogInformation
时,只需传递一个序列化和格式化的JSON即可
一个好的方法是创建一个对象来执行日志逻辑,而不是放在主对象中,然后将其传递到
LogInformation
添加一个自定义格式化程序,这样我就可以做到这一点。代码变为:
Func<LogLevel, object, Exception, string> logFormatter = (a, b, c) => "{\"Hello from\":\"GinjaNinja\"}";
谢谢你的回答。我希望有一种方法可以在设置中提供格式化程序,而不是更改每个日志调用。@GinjaNinja如果您创建自己的自定义格式化程序类,在调用真正的日志格式化程序之前,该类将用作中间类来格式化日志,您就可以实现这一点,如果有时间,我会用一些示例代码更新我的答案。听起来很理想。如果你能提供一些代码和接线样本,我将接受答案
configLogging.AddAWSProvider(hostContext.Configuration.GetAWSLoggingConfigSection(), formatter:logFormatter);