2017-07-12 4 views
0

C++で作成された動的ライブラリ関数にコールバックとして渡されるC#関数があります。これらのコールバックは別のスレッドから呼び出されるかもしれないと思います。コールバック関数は、ロガーを使用している:私は、ロギングモデルとコールバック関数では、ロギングをオンにしたときExclusiveLock対MinimalLock

private static readonly log4net.ILog _Log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 

のprogrammはちょうどクラッシュ:

<_lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> 

そして、私が使用した場合の罰金とさらに高速に動作します:

<lockingModel type="log4net.Appender.FileAppender+ExclusiveLock" /> 

私の場合、ファイルローリングが実行されていないので、MinimalLockで十分です。私が間違っている? MinimalLockケースでプログラムの減速をexplaneするには?

<appender name="DebugLogFileAppender" type="log4net.Appender.RollingFileAppender"> 
     <encoding value="utf-8" /> 
     <param name="File" value="./WrpLog/" /> 
     <_lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> 
     <lockingModel type="log4net.Appender.FileAppender+ExclusiveLock" /> 

     <appendToFile value="true" /> 
     <rollingStyle value="Date" /> 
     <datePattern value="Debu\g.yyyy-MM-dd.lo\g" /> 
     <staticLogFileName value="false" /> 
     <maxSizeRollBackups value="10" /> 
     <filter type="log4net.Filter.LevelRangeFilter"> 
      <acceptOnMatch value="true" /> 
      <_levelMin value="INFO" /> 
      <_levelMax value="OFF" /> 
      <levelMin value="ALL" /> 
      <levelMax value="DEBUG" /> 
     </filter> 
     <layout type="log4net.Layout.PatternLayout"> 
      <param name="ConversionPattern" value="%d [%t] %m /// %c%n" /> 
     </layout> 
    </appender> 

答えて

1

最小限のロックを使用すると、log4netはファイルに書き込むときにファイルをロックします。これは各ログメッセージで実行されます。排他ロックが設定されている場合、ファイルは常にロックされたままであり、ファイルを再度開く必要はありません。排他ロックはパフォーマンスは向上しますが、別の場所からファイルを開いたり書き込んだりすることはできません。最小限のロックでは、複数の場所から1つのファイルに書き込むことができますが、パフォーマンスがExclusiveロックよりもはるかに悪いことがわかりました。

+0

これは両方のログタイプがスレッドセーフであり、どちらも安全でないことを意味しますか? – vico

+1

彼らはtotを持っていますが、あなたのクラッシュがlog4netによって引き起こされた場合(log4netが投げている)、それを引き起こすために取る手順を見たいと思います。なぜなら、log4netはアプリケーションをクラッシュさせないためです。 – Peter

関連する問題