Эта запись блога является частью серии Как создать службу 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.