Эта запись блога является частью серии Как создать службу Windows, которая планирует задания, ведет журналы и настраивается с помощью внедрения зависимостей.

В предыдущем сообщении в блоге мы создали простую службу Windows с Topshelf, которую можно установить с помощью простой командной строки. Когда мы запустили нашу службу Windows как консольное приложение, мы увидели следующий вывод:

Мы видим, что здесь происходит ведение журнала по умолчанию. В этом сообщении блога мы увидим, как настроить собственное ведение журнала с помощью log4net, библиотеки Apache, которая общедоступна в виде пакета NuGet. Прежде чем мы покажем, как это сделать, давайте сначала попробуем понять, как ведение журнала реализовано в Topshelf.

Если мы декомпилируем методы Topshelf HostFactory.New() и HostFactory.Run(), мы увидим вызовы метода HostLogger.Get(), который возвращает LogWriter, выполняющий фактическую регистрацию. В методе HostLogger.Get() HostLogger использует LogWriterFactory для создания экземпляра LogWriter, который затем возвращается. HostLogger предоставляет значение по умолчанию для свойства LogWriterFactory, поэтому мы видим ведение журнала при запуске нашего консольного приложения. Мы можем предоставить пользовательский LogWriterFactory, позвонив по телефону HostLogger.UseLogger(HostLoggerConfigurator configurator). HostLoggerConfigurator является фабрикой для LogWriterFactory и содержит единственный метод с именем CreateLogWriterFactory().

Типы HostLoggerConfigurator, LogWriterFactory и LogWriter являются интерфейсами. Это означает, что мы можем предоставлять свои собственные реализации и предоставлять их с помощью метода HostLogger.UseLogger(). По умолчанию HostLogger использует реализации TraceHostLoggerConfigurator, TraceLogWriterFactory и TraceLogWriter из пространства имен Topshelf.Logging. Вместе они настроили TraceSource с TraceListener, который выводит в консоль — поэтому мы видим логи в консоли. TraceSource и TraceListener — это типы из System.Diagnostics, и вы можете больше узнать о них на странице документов Microsoft.

Теперь, когда мы знаем, как работает ведение журнала в Topshelf, нужно просто предоставить собственные реализации log4net для HostLoggerConfigurator, LogWriterFactory и LogWriter, или мы можем использовать пакет NuGet, который сделает это за нас — Topshelf.Log4Net.

После установки Topshelf.Log4Net мы можем сделать следующее:

XmlConfigurator.Configure() настраивает log4net из нашего файла app.config.

hostConfigurator.UseLog4Net() предоставляет реализации log4net для HostLoggerConfigurator, LogWriterFactory, LogWriter и передает их HostLogger через HostLogger.UseLogger().

Как только это будет сделано, мы получим следующий вывод:

Мы видим шаблон ведения журнала, который теперь настроен в предоставленном файле app.config below.

Если вы не знакомы с API конфигурации log4net, вы можете узнать больше на https://logging.apache.org/log4net/release/manual/configuration.html.

В следующем посте мы настроим внедрение зависимостей с помощью Autofac.