2017-05-22 2 views
1

着信要求とその応答をログに記録するためにNLogを使用するAPIを開発しています。 は時折私はこの問題は私がになることが非同期ラッパーを使用していたという事実であるNLogを使用するとFileLoadExceptionが発生する

Application: w3wp.exe 
Framework Version: v4.0.30319 
Description: The process was terminated due to an unhandled exception. 
Exception Info: System.IO.FileLoadException  
at System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal(Int32, IntPtr)  
at NLog.Internal.FileAppenders.BaseFileAppender.WindowsCreateFile(System.String, Boolean)  
at NLog.Internal.FileAppenders.BaseFileAppender.TryCreateFileStream(Boolean) 
at NLog.Internal.FileAppenders.BaseFileAppender.CreateFileStream(Boolean) 
at NLog.Internal.FileAppenders.RetryingMultiProcessFileAppender.Write(Byte[]) 
at NLog.Targets.FileTarget.WriteToFile(System.String, NLog.LogEventInfo, Byte[], Boolean)  
at NLog.Targets.FileTarget.ProcessLogEvent(NLog.LogEventInfo, System.String, Byte[])  
at NLog.Targets.FileTarget.FlushCurrentFileWrites(System.String, NLog.LogEventInfo, System.IO.MemoryStream, System.Collections.Generic.List`1<NLog.Common.AsyncContinuation>) 
at NLog.Targets.FileTarget.Write(NLog.Common.AsyncLogEventInfo[]) 
at NLog.Targets.Target.WriteAsyncLogEvents(NLog.Common.AsyncLogEventInfo[]) 
at NLog.Targets.Wrappers.AsyncTargetWrapper.ProcessPendingEvents(System.Object) 
at System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)  
at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)  
at System.Threading.TimerQueueTimer.CallCallback()  
at System.Threading.TimerQueueTimer.Fire()  
at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem() 
at System.Threading.ThreadPoolWorkQueue.Dispatch() 

マイnlog.configが私の意見では、この

<?xml version="1.0" encoding="utf-8" ?> 
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" autoReload="true" throwExceptions="true"> 

    <variable name="logPath" value="${basedir}/App_Data/Logs"/> 
    <variable name="rowFormatInfo" value="${longdate} | ${level:uppercase=true} | ${message} | Thread: ${threadid}" /> 

    <targets async="true"> 
    <target name="traceFile" xsi:type="AsyncWrapper" overflowAction="Grow"> 
     <target xsi:type="File" fileName="${logPath}/${shortdate}.trace.log" layout="${rowFormatInfo}" /> 
    </target> 
    </targets> 

    <rules> 
    <logger name="*" minlevel="Trace" maxlevel="Debug" writeTo="traceFile" /> 
    </rules> 
</nlog> 

のように見える私のサーバー上で次のエラーを取得していますログファイルにアクセスしようとする複数のスレッドを混在させる。 私のAPIが毎秒何十回もの要求を処理しなければならないピーク時にこのようなエラーが発生するのを防ぐ回避策はありますか?同期ロギングへの切り替えは、APIが複数のスレッドで同時に実行されるために役立ちません。彼らはただ非同期キュー(およびないファイル)に書き込まれますと、同じアプリケーション内での提案

+0

これはNLogバージョンですか? 'throwExceptions =" false "' – Julian

+0

現在のバージョン4.3.4を設定することもお勧めします。私は最新のものが4.4.9であることを知っていますが、重要なバージョンアップデートではないので、それは重要ではないと思います。私は今度は偽に設定するスロー例外部を逃しました。しかし、これはちょうど私がそれを理解している場合、例外を飲み込む?これはそれが起こるのを妨げません。ロットで –

+0

がNLogのFileTargetで変更されました。少なくとも10のFileTargetの問題と4.3.4の前のリリースです。更新をお勧めします。 – Julian

答えて

2

複数のスレッドのための

おかげで、すべての問題を与えるべきではありません。しかし、同じファイルに複数のアプリケーションを作成している場合、問題が発生する可能性があります。

外部アプリケーションがログファイルを監視し、他の場所(例:SPLUNK)の内容をコピーしようとする場合にも、この問題が発生する可能性があります。

あなたは、複数のアプリケーションその後、単にファイル・ターゲットにこれらのオプションを追加し、同じファイルへの書き込みがない場合:

<target xsi:type="File" 
     fileName="${logPath}/${shortdate}.trace.log" 
     layout="${rowFormatInfo}" 
     keepFileOpen="true" 
     concurrentWrites="false" /> 

あなたが同じファイルへの書き込みを複数のアプリケーション/のAppDomainを持っていない場合は、その後、(現在は4.4.10)の最新NLogにアップグレードすると、ファイル・ターゲット上でこれらのオプションを使用し

<target xsi:type="File" 
     fileName="${logPath}/${shortdate}.trace.log" 
     layout="${rowFormatInfo}" 
     keepFileOpen="true" 
     concurrentWrites="true" /> 
+0

ありがとうございます。 VSなどでファイルを見ているだけでも、これがときどき発生します。 – Macke

関連する問題