1

Windows サービスで動的にロードされた dll から NLog を使用して eventLog に書き込む方法。

NLog 2.0.1 を使用して、動的に dll をロードする 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 アプリを作成しましたが、ロギングは期待どおりに機能しますが、自分のサービスで同じことをしようとすると機能しません。

「Local System」および「Network Service」でサービスを実行しようとしましたが、同じエラーが発生します。「ネットワークパス....」に関しては、アクセスされているネットワークパスがないため、これが何を伝えようとしているのかわかりません。

私の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

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 に答える