日志消息的JSON格式

时间:2019-09-16 09:50:01

标签: json logging .net-core amazon-cloudwatch

我正在使用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。也使用

2 个答案:

答案 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);
相关问题