Как создать собственный форматировщик текста для Cloudwatch? - PullRequest
0 голосов
/ 08 января 2019

Я не понимаю, как создать собственный форматировщик текста для 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;
}

Чтобы можно было писать Serilogs в Cloudwatch.

1 Ответ

0 голосов
/ 09 января 2019

Я прошел сегодня для той же ситуации, и я выяснил, что этот настраиваемый форматер - который по умолчанию никто не устанавливает - позволяет установить, как будет записываться журнал, и, следовательно, он будет отображаться в журналах 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.
...