Serilog с проектом .NET Server AWS без веб-API - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть приложение AWS Serverless API, созданное на основе .NET Core (2.1).Я настроил это с помощью регистрации в Serilog, которая использует приемник AWS Cloudwatch в качестве места назначения для ведения журнала.Этот проект зависит от общей библиотеки классов, в которой находится основная логика.

Я заметил, что не все мои сообщения о регистрации попадают в Cloudwatch.Сообщения в моих контроллерах API успешно регистрируются, но сообщения из общей библиотеки классов регистрируются только при локальном запуске, а не при использовании живого API.

Вот мои настройки ведения журнала при запуске.

var awsCredentials = new BasicAWSCredentials(config["AWS:AccessKey"], config["AWS:SecretKey"]);
if (env.IsProduction())
{
    var options = new CloudWatchSinkOptions
    {
        LogGroupName = config["AWS:Cloudwatch:LogGroup"],
        LogStreamNameProvider = new LogStreamNameProvider(),
        TextFormatter = new Serilog.Formatting.Json.JsonFormatter()
    };

    var client = new AmazonCloudWatchLogsClient(awsCredentials, RegionEndpoint.EUWest2);
    Log.Logger = new LoggerConfiguration()
        .Enrich.WithExceptionDetails()
        .WriteTo
        .AmazonCloudWatch(options, client)
        .CreateLogger();
}

services.AddSingleton(Log.Logger);

Я также пытался добавить services.AddLogging(builder => builder.AddSerilog());, но это не помогло.

Я использую это так:

public class TestService
{
    private readonly ILogger logger;

    public TestService(ILogger logger)
    {
        this.logger = logger;
    }

    public void TestMethod()
    {
        this.logger.Information("Test Message");
    }
}

1 Ответ

0 голосов
/ 20 ноября 2018

Стандартная структура внедрения зависимостей имеет несколько ограничений.Внутри контроллера зависимости будут автоматически загружаться через размещение в конструкторе.Однако во вложенных классах вы должны передать саму зависимость, иначе среда не будет автоматически разрешена.Фреймворк работает в презумпции корня композиции.По сути:

// Auto Resolved:
public class SampleController : Controller
{
     private readonly ILogger logger;

     public SampleController(ILogger logger) => this.logger = logger;

     public IActionResult Index()
     {
         logger.Information("...");
         ..
     }
}

// Will not auto resolve
public class SampleService
{
     private readonly ILogger logger;

     public SampleService(ILogger logger) => this.logger = logger;

     public void SampleAction()
     {
         logger.Information("...");
         ..
     }
}

Чтобы правильно внедрить регистратор в SampleService, вам нужно будет сделать что-то вроде этого:

// Logger as property
Logger = serviceProvider.GetService<ILogger>();
var sampleService = new SampleService(Logger);

// Called directly passed
var sampleService = new SampleService(serviceProvider.GetService<ILogger>());

Это был мой опыт, иначеон не сможет использовать заданную вами реализацию.Может быть информация, которой у меня нет, которая также может повлиять на ваш код.

...