2017-07-21 27 views
0

をブロックすると、パフォーマンスモニタからのスタックトレースを分析した後、私は私がロガーを初期化log4netのは、私が活動をログに記録するlog4netのを使用しています

ntdll!NtWaitForMultipleObjects+a 
    KERNELBASE!WaitForMultipleObjectsEx+e1 
    clr!WaitForMultipleObjectsEx_SO_TOLERANT+62 
    clr!Thread::DoAppropriateWaitWorker+1e4 
    clr!Thread::DoAppropriateWait+7d 
    clr!CLREventBase::WaitEx+c4 
    clr!AwareLock::EnterEpilogHelper+ca 
    [[GCFrame]] 
    clr!AwareLock::EnterEpilog+62 
    clr!AwareLock::Contention+2a7f4a 
    clr!JITutil_MonContention+af 
    [[GCFrame]] 
    [[HelperMethodFrame] (System.Threading.Monitor.Enter)] System.Threading.Monitor.Enter(System.Object) 
    log4net.Appender.AppenderSkeleton.DoAppend(log4net.Core.LoggingEvent)+47 
    log4net.Util.AppenderAttachedImpl.AppendLoopOnAppenders(log4net.Core.LoggingEvent)+a8 
    log4net.Repository.Hierarchy.Logger.CallAppenders(log4net.Core.LoggingEvent)+74 
    log4net.Repository.Hierarchy.Logger.Log(System.Type, log4net.Core.Level, System.Object, System.Exception)+6a 
    log4net.Core.LogImpl.InfoFormat(System.String, System.Object)+cc 
    Archival.Logic.Status(Archival.ProcessArgs)+240 
    Archival.Logic.Product(Archival.ProcessArgs)+221 
    Archival.Logic.Number(Archival.ProcessArgs, System.Collections.Generic.IEnumerable`1<LenderProduct>)+2e9 
    Archival.Logic+<>c__DisplayClass3_0.<ArchiveDealsPerAsset>b__1(System.String)+b5 
    mscorlib_ni!System.Threading.Tasks.Parallel+<>c__DisplayClass42_0`2[[System.__Canon, mscorlib],[System.__Canon, mscorlib]].<PartitionerForEachWorker>b__1()+2bd 
    mscorlib_ni!System.Threading.Tasks.Task.InnerInvokeWithArg(System.Threading.Tasks.Task)+20 
    mscorlib_ni!System.Threading.Tasks.Task+<>c__DisplayClass176_0.<ExecuteSelfReplicating>b__0(System.Object)+114 
    mscorlib_ni!System.Threading.Tasks.Task.Execute()+46 
    mscorlib_ni!System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)+162 
    mscorlib_ni!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)+14 
    mscorlib_ni!System.Threading.Tasks.Task.ExecuteWithThreadLocal(System.Threading.Tasks.Task ByRef)+21c 
    mscorlib_ni!System.Threading.Tasks.Task.ExecuteEntry(Boolean)+73 
    mscorlib_ni!System.Threading.ThreadPoolWorkQueue.Dispatch()+152 
    clr!CallDescrWorkerInternal+83 
    clr!CallDescrWorkerWithHandler+4e 
    clr!MethodDescCallSite::CallTargetWorker+f8 
    clr!QueueUserWorkItemManagedCallback+2a 
    clr!ManagedThreadBase_DispatchInner+39 
    clr!ManagedThreadBase_DispatchMiddle+6c 
    clr!ManagedThreadBase_DispatchOuter+75 
    [[DebuggerU2MCatchHandlerFrame]] 
    clr!ManagedThreadBase_FullTransitionWithAD+2f 
    clr!ManagedPerAppDomainTPCount::DispatchWorkItem+a0 
    clr!ThreadpoolMgr::ExecuteWorkRequest+64 
    clr!ThreadpoolMgr::WorkerThreadStart+f5 
    clr!Thread::intermediateThreadProc+86 
    kernel32!BaseThreadInitThunk+22 
    ntdll!RtlUserThreadStart+34 

下に示すように、シナリオのようなデッドロックがある参照

private static readonly ILog logger = LogManager.GetLogger(typeof(Program)); 

このシナリオを避けるためには何ができるのですか? 私はスレッドログごとに追加するオプションを見直しましたが、1日に100個のログを持つので、これは過剰です。

<log4net> 
<appender name="ColoredConsoleAppender" type="log4net.Appender.ColoredConsoleAppender"> 
    <mapping> 
    <level value="ERROR"/> 
    <foreColor value="White"/> 
    <backColor value="Red"/> 
    </mapping> 
    <mapping> 
    <level value="WARN"/> 
    <foreColor value="White"/> 
    <backColor value="Yellow"/> 
    </mapping> 
    <layout type="log4net.Layout.PatternLayout"> 
    <conversionPattern value="%date [%thread] - %message%newline"/> 
    </layout> 
    <filter type="log4net.Filter.LevelRangeFilter"> 
    <levelMin value="INFO"/> 
    </filter> 
</appender> 
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender"> 
    <file value="Logs\logfile.txt"/> 
    <appendToFile value="true"/> 
    <rollingStyle value="Date"/> 
    <datePattern value="yyyyMMdd"/> 
    <maxSizeRollBackups value="3"/> 
    <layout type="log4net.Layout.PatternLayout"> 
    <conversionPattern value="%date [%thread] %-5level - %message%newline"/> 
    </layout> 
    <filter type="log4net.Filter.LevelRangeFilter"> 
    <levelMin value="INFO"/> 
    </filter> 
</appender> 
<root> 
    <level value="ALL"/> 
    <appender-ref ref="ColoredConsoleAppender"/> 
    <appender-ref ref="RollingLogFileAppender"/> 
</root> 

+0

log4netはスタックトレースに含まれているので、log4netではなくNLogを使用していることを確認してください。 –

+0

@RolfKristensenはい、私はLog4Netを使用しています。タイトルを変更しました – user2526236

+0

アペンダーの設定は何ですか? – Peter

答えて

0

あなたが書きたい時にログ\ logfile.txtというがロックされているいくつかの理由のために、何が起こっている上だけの推測:

は、以下のlog4netのための設定ですファイル。 2番目のログメッセージは、最初のログメッセージが完了するまで待機します(スタックトレース)。ファイルをロックする必要があるため、最小限のロックはここでは役に立ちません。ログファイルにアクセスするには、最初にコピーして、検査ツールを使用してログファイルのコピーバージョンを開く必要があります。そうすれば、ログファイルにログを記録したいプロセスをブロックすることはできません。

+0

ロガーごとにロック/モニタを追加しますか.InfoFormat( "記録するメッセージ")ヘルプ。これによりパフォーマンス上の問題が発生しますか? – user2526236

+0

ファイルがロックされている場合、同じレイズ条件になります – Peter

+0

どのようにこの競合状態を解決できますか?任意の提案 – user2526236

関連する問題