【问题标题】:How to show log message with substituted parameters in structured logging output from Serilog on AWS Cloudwatch如何在 AWS Cloudwatch 上的 Serilog 的结构化日志输出中显示带有替换参数的日志消息
【发布时间】:2021-07-15 06:10:44
【问题描述】:

我正在使用 AWS Cloudwatch 进行应用程序日志记录。我最近了解到我可以使用结构化日志记录来使我的日志更易于搜索。我做了一些研究,决定使用 Serilog 作为我的日志记录工具。

我遇到的一个困难是,虽然我在 Cloudwatch 中看到结构化日志消息,但它没有显示完全格式化的日志消息。

例如,当我将其发送到日志时:

_logger.LogError("Hello {person}, {question} are you {time}?", "Dave", "how", "today");

我在 Cloudwatch 日志输出中看到此消息

你好{person},{question}你是{time}吗?

但我在任何地方都看不到字符串的完全替换版本,即

你好,戴夫,你今天好吗?

我按照此演练设置 Serilog 以在 AWS https://martinjt.me/2020/02/16/serilog-and-cloudwatch-with-inbuilt-credentials/ 中进行结构化日志记录,并最终得到此代码。

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
    .ConfigureWebHostDefaults(webBuilder =>
    {
        webBuilder.UseStartup<Startup>()
        .UseSerilog(SetupAWSLogging);
    });

public class LoggingSettings
{
    public string LogGroup { get; set; }
}

public static void SetupAWSLogging(WebHostBuilderContext hostingContext, LoggerConfiguration loggerConfiguration)
{
    var config = hostingContext.Configuration;
    var settings = config.GetSection("Logging").Get<LoggingSettings>();

    loggerConfiguration
        .MinimumLevel.Information()
        .Enrich.FromLogContext()
        .WriteTo.Console();

    if (!string.IsNullOrEmpty(settings.LogGroup))
    {
        var options = new CloudWatchSinkOptions
        {
            LogGroupName = settings.LogGroup,
            CreateLogGroup = true,
            MinimumLogEventLevel = LogEventLevel.Information,
            TextFormatter = new JsonFormatter()
        };
        var awsOptions = config.GetAWSOptions();
        var cloudwatchClient = awsOptions.CreateServiceClient<IAmazonCloudWatchLogs>();
        loggerConfiguration
            .WriteTo.AmazonCloudWatch(options, cloudwatchClient);
    }

}

这是在 Cloudwatch 中找到的完整条目

{
    "Timestamp": "2021-07-05T09:08:32.5118371-06:00",
    "Level": "Error",
    "MessageTemplate": "Hello {person}, {question} are you {time}?",
    "Properties": {
        "person": "Dave",
        "question": "how",
        "time": "today",
        "SourceContext": "Testing",
        "ActionId": "54758041-ee5f-4297-a7b3-adaa5e675901",
        "ActionName": "Testing.Ping (TestController)",
        "RequestId": "80000007-0005-ff00-b63f-84710c7967bb",
        "RequestPath": "/Testing/Ping"
    }
}

我们自己构建消息所需的所有信息都在那里,但是日志的可读性不如我能看到替换的字符串。我有什么遗漏或做错了吗?也许它只是 Cloudwatch 中的一个配置,用于显示带有替换的字符串?如果在那里完成会更好,我想减少日志大小。

感谢大家的帮助。

【问题讨论】:

    标签: .net-core amazon-cloudwatch serilog structured-logging


    【解决方案1】:

    最简单的解决方法是:

                TextFormatter = new JsonFormatter(renderMessage: true)
    

    注意true 以呈现消息。

    【讨论】:

    • 非常感谢,这是完美的。我没有让它单独通过 true 工作,也许你正在使用 beta 版本,但对于最新的稳定版本,我必须做 TextFormatter = new JsonFormatter(renderMessage: true)。
    • 谢谢!修复了示例?
    猜你喜欢
    • 1970-01-01
    • 2016-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多