Как обеспечить запись / закрытие файла журнала в DLL (C# и Serilog) - PullRequest
1 голос
/ 06 января 2020

В настоящее время я экспериментирую с Serilog для записи в файл и на консоль, в основном для отладки небольшой C# DLL, над которой я работаю.

Я не уверен, как go о сбрасывании / закрытии файл журнала, то есть:

Log.CloseAndFlush()

Я мог бы сделать это в деструкторе, но другие статьи о переполнении стека предполагают, что это неразумно, поскольку его выполнение не гарантируется.

Другие пункты:

  • Журнал Serilog публично не предоставляется классом DLL.
  • Что, если класс является статичным c? (Это не так, но мне любопытно, что это значит).

1 Ответ

0 голосов
/ 06 января 2020

Ваша DLL не должна выбирать, какую библиотеку реализации ведения журналов использовать, но оставьте это на усмотрение потребителя вашей библиотеки. Просто придерживайтесь абстракции, скорее всего, Microsoft.Extensions.Logging и ее интерфейсов.

Как правило, если вам нужно, чтобы потребитель выполнял какие-либо действия по очистке, связанные с вашей библиотекой, вы должны раскрыть явный API для этого. Как и в случае с Serilog, метод Log.CloseAndFlush() был представлен в первую очередь. Serilog (в настоящее время / возможно) просто не знает, когда вызывать его при любых обстоятельствах, и поэтому «просто» оставляет эту задачу для потребителя (в конечном счете, для приложения / исполняемого файла).

Рассмотрим:

namespace YourLibrary 
{
   public static class Util
   {
       public static void Shutdown()
       {
           // Potentially other stuff...

           // Cleanup logging
           Log.CloseAndFlush();
       }
   }
}

Затем вы требуете от своих потребителей сделать что-то вроде этого (пример):

public static void Main()
{
   try
   {
      // ... whatever ...
   }
   finally
   {
      YourLibrary.Util.Shutdown();
   }
}

Этот дизайн не является оптимальным с точки зрения использования, но, по крайней мере, он делает вещи явными.

В конце концов, однако, всегда будут ситуации, когда вы не можете вызвать метод очистки (crashes, et c.), Поэтому я хотел бы предложить то, что Ганс сказал в своем комментарии: ищите другую запись в журнале. реализация фреймворка (или выберите Serilog Sink, который всегда сбрасывается неявно).

...