1

如何使用 NLog 从 Windows 服务中动态加载的 dll 写入 eventLog。

使用 NLog 2.0.1 我有一个 Windows 服务,它可以从我正在使用(试图)NLog 记录到 EventLog 的那个 dll 中动态加载一个 dll。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}"
            />

任何关于如何使这项工作的想法将不胜感激。

4

2 回答 2

1

嗯,很尴尬,但也许它会节省一些时间。

简短的回答,nlog.config 文件位于错误的目录中。

该解决方案有两个项目,服务主机/安装程序项目和完成逻辑/工作的项目。服务从服务主机/安装程序的调试文件夹安装(仍处于早期测试阶段)。逻辑 dll 由服务 hsot 从逻辑项目调试文件夹加载。逻辑文件夹包含 nlog.config。因此,当服务启动时,nlog.config 文件找不到服务主机运行的位置。

服务主机没有对 service.dll 的引用,这不是问题,因为 dll 是在运行时加载的,但 nlog.config 文件是一个问题。

创建服务的简单解决方案是将逻辑/工作项目输出更改为与服务主机输出目录相同。

于 2013-06-27T19:46:08.537 回答
0

如果源不存在,我在尝试创建 EventLog 并设置 MaximumKilobytes 时遇到 System.TypeInitializationException。

通过在创建 EventLog 对象之前移动 EventLog.CreateEventSource() 来解决。

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;
于 2014-03-12T18:55:45.903 回答