如何为 Cloudwatch 创建自定义文本格式化程序?
Posted
技术标签:
【中文标题】如何为 Cloudwatch 创建自定义文本格式化程序?【英文标题】:How to create a Custom text formatter for Cloudwatch? 【发布时间】:2019-01-08 09:37:43 【问题描述】:如前所述,我不明白如何为 Amazon Cloudwatch 创建自定义文本格式化程序:
var formatter = new MyCustomTextFormatter();
我正在尝试将 Serilog 日志写入 Amazon CloudWatch 而不是本地硬盘。为此,我正在关注此回购:
https://github.com/Cimpress-MCP/serilog-sinks-awscloudwatch
private readonly ITextFormatter textFormatter;
public ILoggerFactory ConfigureLogger()
LoggerFactory factory = new LoggerFactory();
var logGroupName = "myLoggrouName";
var region = Amazon.RegionEndpoint.EUWest1;
var client = new AmazonCloudWatchLogsClient(region);
//var formatter = new MyCustomTextFormatter();
var options = new CloudWatchSinkOptions()
LogGroupName = logGroupName,
//TextFormatter = formatter,
MinimumLogEventLevel = LogEventLevel.Information,
BatchSizeLimit = 100,
QueueSizeLimit = 10000,
Period = TimeSpan.FromSeconds(10),
CreateLogGroup = true,
LogStreamNameProvider = new DefaultLogStreamProvider(),
RetryAttempts = 5
;
Log.Logger = new LoggerConfiguration()
.WriteTo.AmazonCloudWatch(options, client)
.CreateLogger();
return factory;
能够将 Serilog 写入 Cloudwatch。
【问题讨论】:
【参考方案1】:我今天通过了同样的情况,我发现自定义格式化程序 - 默认情况下没有设置 - 它用于设置日志的写入方式,因此它将出现在 AWS 日志中。
您可以使用 Serilog 提供的界面开始创建简单的格式化程序,并根据您的情况进行调整。
public class AWSTextFormatter : ITextFormatter
public void Format(LogEvent logEvent, TextWriter output)
output.Write("Timestamp - 0 | Level - 1 | Message 2 3", logEvent.Timestamp, logEvent.Level, logEvent.MessageTemplate, output.NewLine);
if (logEvent.Exception != null)
output.Write("Exception - 0", logEvent.Exception);
使用它
var customFormatter = new AWSTextFormatter();
var options = new CloudWatchSinkOptions
// the name of the CloudWatch Log group for logging
LogGroupName = logGroupName,
// the main formatter of the log event
TextFormatter = customFormatter,
// other defaults defaults
MinimumLogEventLevel = LogEventLevel.Information,
BatchSizeLimit = 100,
QueueSizeLimit = 10000,
Period = TimeSpan.FromSeconds(10),
CreateLogGroup = true,
LogStreamNameProvider = new DefaultLogStreamProvider(),
RetryAttempts = 5
;
在该方法中,您可以访问 LogEvent 并获取所需的所有信息。这个和他们在lib中使用的类似,写了事件、异常和一些细节。
建议是在本地测试自定义格式化程序,将日志写入某个文件
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.WriteTo.RollingFile(customFormatter, Path.Combine(env.ContentRootPath, "Logs", "Log-Date.txt"))
.WriteTo.AmazonCloudWatch(options, client)
.CreateLogger();
日志显示的内容:
Timestamp - 1/9/2019 11:52:11 AM -02:00 | Level - Fatal | Message PROBLEM STARTING
APPLICATION
Exception - Couchbase.Configuration.Server.Serialization.BootstrapException: Could not
bootstrap - check inner exceptions for details.
【讨论】:
【参考方案2】:您也可以使用 Serilog 的默认 Json 格式化程序。
using Serilog.Formatting.Json;
然后:
TextFormatter = new JsonFormatter(Environment.NewLine);
【讨论】:
以上是关于如何为 Cloudwatch 创建自定义文本格式化程序?的主要内容,如果未能解决你的问题,请参考以下文章