如何为 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 创建自定义文本格式化程序?的主要内容,如果未能解决你的问题,请参考以下文章

如何为以下示例创建自定义格式、公式或 VBA 代码?

如何为列表视图创建自定义光标适配器以用于图像和文本?

如何为 QtCreator 创建自定义主题

如何为自定义 BAT 文件创建 HELP 命令?

如何为 404 Not Found 创建自定义响应消息?

如何为DateTime创建和使用自定义IFormatProvider?