如何在 AWS Cloudwatch 上的 Serilog 的结构化日志输出中显示带有替换参数的日志消息
How to show log message with substituted parameters in structured logging output from Serilog on AWS Cloudwatch
我正在使用 AWS Cloudwatch 进行应用程序日志记录。我最近了解到我可以使用结构化日志记录来使我的日志更易于搜索。我做了一些研究并决定使用 Serilog 作为我的日志记录工具。
我遇到的一个困难是,虽然我在 Cloudwatch 中看到了结构化日志消息,但它没有显示完整格式的日志消息。
例如,当我将此发送到日志时:
_logger.LogError("Hello {person}, {question} are you {time}?", "Dave", "how", "today");
我在 Cloudwatch 日志输出中看到这条消息
Hello {person}, {question} are you {time}?
但我在任何地方都看不到字符串的完全替换版本,即
Hello Dave how are you today?
我按照这个关于在 AWS 中为结构化日志记录设置 Serilog 的演练 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 中的一个配置来显示带替换的字符串?如果在那里完成会更好我想减少日志大小。
感谢大家的帮助。
最简单的修复是:
TextFormatter = new JsonFormatter(renderMessage: true)
注意 true
以呈现消息。
我正在使用 AWS Cloudwatch 进行应用程序日志记录。我最近了解到我可以使用结构化日志记录来使我的日志更易于搜索。我做了一些研究并决定使用 Serilog 作为我的日志记录工具。
我遇到的一个困难是,虽然我在 Cloudwatch 中看到了结构化日志消息,但它没有显示完整格式的日志消息。
例如,当我将此发送到日志时:
_logger.LogError("Hello {person}, {question} are you {time}?", "Dave", "how", "today");
我在 Cloudwatch 日志输出中看到这条消息
Hello {person}, {question} are you {time}?
但我在任何地方都看不到字符串的完全替换版本,即
Hello Dave how are you today?
我按照这个关于在 AWS 中为结构化日志记录设置 Serilog 的演练 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 中的一个配置来显示带替换的字符串?如果在那里完成会更好我想减少日志大小。
感谢大家的帮助。
最简单的修复是:
TextFormatter = new JsonFormatter(renderMessage: true)
注意 true
以呈现消息。