Serilog не записывает журнал в Seq, пока не будет вызван Log.CloseAndFlush()
Serilog и Seq отлично работают, когда я захожу из WinForm/ веб-приложения. Я сталкиваюсь с проблемой только тогда, когда использую консольное приложение. Без записи Log.CloseAndFlush()
это не работает. Следующее - моя LoggerConfiguration
Log.Logger = new LoggerConfiguration()
.WriteTo.Seq("http://localhost:5341")
.CreateLogger();
Есть ли способ войти без вызова Log.CloseAndFlush()
так что он работает с seq, serilog в консольном приложении.
2 ответа
Log.CloseAndFlush()
требуется только один раз вызвать в консольном приложении, прежде чем приложение завершится. Это метод "выключения", который гарантирует, что любые буферизованные события обрабатываются до выхода из приложения.
Документация Serilog Lifecycle of Loggers содержит более подробную информацию о CloseAndFlush()
,
Просто попытался понять, почему Dispose() или CloseAndFlush() не работает для функции AWS Lambda. И похоже, что Dispose/CloseAndFlush не имеет гарантии , что все буферизованные события будут отправлены во время вызова этого метода. Сик!
Здесь мы можем увидеть подтверждение такого поведения:https://github.com/serilog/serilog/issues/1111 .
public async Task<string> FunctionHandler(JObject input, ILambdaContext context)
{
var logger = LogService.GetInstance(); //wrapped Logger instance
try
{
throw new ApplicationException("lambda test error");
}
catch (Exception e)
{
Console.WriteLine(e);
logger.Error(e, "AWS_Lambda call failed");
}
logger.Dispose(); // here CloseAndFlush or dispose calling (tried both variants)
Thread.Sleep(3000); //not work without it
return input.ToString().ToUpper();
}
Итак, вы можете просто вызвать Thread.Sleep(3000) и удерживать 2-3 секунды, которые... МОЖЕТ отправить все журналы на ваши приемники. Конечно, это не вариант для AWS Lambdas, поэтому, если кто-то найдет работающее решение, выложите его сюда, пожалуйста. Спасибо!
Возможный обходной путь: только одно решение см. здесь: сделать задержку этого потока на случай, если во время запроса/жизненного цикла вы вообще собрали некоторые журналы, поэтому в моем случае я просто устанавливаю флаг bool в значение true в случае любого журнала, а затем проверяю его, прежде чем лямбда будет закончено, если это правда - переводить поток в спящий режим, чтобы можно было отправлять журналы. Странно, но работает хорошо... И, конечно, вам нужно контролировать, чтобы это происходило только для исключений или, другими словами, - редко.