Как написать в eventLog с NLog из динамически загруженной библиотеки DLL в службе Windows

Как написать в eventLog с NLog из динамически загруженной библиотеки DLL в службе Windows.

Используя NLog 2.0.1, у меня есть служба Windows, которая динамически загружает DLL, внутри этой библиотеки я использую (пытаюсь) NLog для входа в EventLog. EventLog является пользовательским и создается установщиком службы.

Ошибка:

    Service cannot be started. System.Reflection.TargetInvocationException:
Exception has been thrown     by the target of an invocation. 
---> System.TypeInitializationException: The type initializer for 'MyService.Worker' threw an exception. 
---> NLog.NLogConfigurationException: Error during initialization of EventLog Target[eventLog_wrapped] 
---> System.IO.IOException: The network path was not found.

       at Microsoft.Win32.RegistryKey.Win32ErrorStatic(Int32 errorCode, String str)
       at Microsoft.Win32.RegistryKey.OpenRemoteBaseKey(RegistryHive hKey, String machineName, RegistryView view)
       at System.Diagnostics.EventLog.GetEventLogRegKey(String machine, Boolean writable)
       at System.Diagnostics.EventLog.FindSourceRegistration(String source, String machineName, Boolean readOnly, Boolean wantToCreate)
       at System.Diagnostics.EventLog._InternalLogNameFromSourceName(String source, String machineName)
       at System.Diagnostics.EventLog.LogNameFromSourceName(String source, String machineName)
       at NLog.Targets.EventLogTarg...

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

Я попытался запустить службу под "Локальная система" и "Сетевая служба", я получаю ту же ошибку. Что касается "Путь к сети....", то нет доступа к сетевому пути, поэтому я не уверен, что это пытается сказать мне.

моя конфигурация / цель NLog:

<variable name="appName" value="MyApp" />
<variable name="source" value="MySource" />

    <target xsi:type="EventLog"
        name="log"
        log="My Service"
        source="${source}"
        machineName="."
        layout="${callsite}${newline} ${message}${newline}${exception:format=ToString}"
            />

Любые идеи о том, как получить эту работу, будут оценены.

2 ответа

Решение

Что ж, неловко, но, возможно, это сэкономит кому-то время.

Краткий ответ, файл nlog.config находится не в том каталоге.

Решение имеет два проекта: сервисный хост-проект / инсталлятор и проект, в котором выполняется логика / работа. Служба устанавливается из папки отладки для службы / установщика службы (все еще в раннем тестировании). Логическая библиотека DLL загружается из папки отладки логического проекта службой hsot. Папка логики содержит файл nlog.config. Поэтому, когда служба запускается, файл nlog.config не может быть найден там, где работает узел службы.

Хост службы не имеет ссылки на service.dll, это не проблема, поскольку dll загружается во время выполнения, но проблема была в файле nlog.config.

Простое решение для создания службы состоит в том, чтобы изменить выходные данные логического / рабочего проекта так, чтобы они совпадали с выходным каталогом узла службы.

У меня было System.TypeInitializationException при попытке создать EventLog и установить MaximumKilobytes, если источник не существует.

Решается перемещением EventLog.CreateEventSource() перед созданием объекта EventLog.

if (!EventLog.SourceExists(SOURCE)) {
EventLog.CreateEventSource(SOURCE, LOG);
}
eventLog = new EventLog();
eventLog.Source = SOURCE;
eventLog.Log = LOG;
eventLog.MachineName = System.Environment.MachineName;
eventLog.MaximumKilobytes = 1024;
Другие вопросы по тегам