Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
日志消息的JSON格式_Json_Logging_.net Core_Amazon Cloudwatch - Fatal编程技术网

日志消息的JSON格式

日志消息的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

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

。您甚至可以将其用于分析。

调用
LogInformation
时,只需传递一个序列化和格式化的JSON即可


一个好的方法是创建一个对象来执行日志逻辑,而不是放在主对象中,然后将其传递到
LogInformation

添加一个自定义格式化程序,这样我就可以做到这一点。代码变为:

Func<LogLevel, object, Exception, string> logFormatter = (a, b, c) => "{\"Hello from\":\"GinjaNinja\"}";

谢谢你的回答。我希望有一种方法可以在设置中提供格式化程序,而不是更改每个日志调用。@GinjaNinja如果您创建自己的自定义格式化程序类,在调用真正的日志格式化程序之前,该类将用作中间类来格式化日志,您就可以实现这一点,如果有时间,我会用一些示例代码更新我的答案。听起来很理想。如果你能提供一些代码和接线样本,我将接受答案
configLogging.AddAWSProvider(hostContext.Configuration.GetAWSLoggingConfigSection(), formatter:logFormatter);