1

AppDomain.FirstChanceExceptionオプションで、発生したすべての例外をログに記録し、処理されたかどうかにかかわらず、WPF アプリに実装したいと考えています。これらの例外を、NLog 用に構成したターゲットに記録したくありません。NLogが特定の1つのターゲットにのみログを記録するように呼び出すときLogger.Error(または任意のメソッド)は可能ですか?Logger

4

1 に答える 1

6

可能ですが、次の理由から、これはお勧めできません。

  1. スレッドセーフではありません。
  2. 指定したファクトリのすべてのロガーが再構成されます。

構成ファイル:

<?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">
  <targets async="true">
    <target name="file1" xsi:type="File" fileName="${basedir}/log1.txt" />
    <target name="file2" xsi:type="File" fileName="${basedir}/log2.txt" />
  </targets>
  <rules>
    <logger name="*" minlevel="Trace" writeTo="file1,file2" />
  </rules>
</nlog>

グローバル ファクトリ構成の例:

var logger = LogManager.GetCurrentClassLogger();

logger.Error("Original Configuration");

var configOrig = LogManager.Configuration;
var configTemp = LogManager.Configuration.Reload();
var rule = configTemp.LoggingRules.First(r => r.NameMatches("*"));
var target = configTemp.FindTargetByName("file2");

rule.Targets.Remove(target);

LogManager.Configuration = configTemp;
logger.Error("Temporary Configuration");

LogManager.Configuration = configOrig;
logger.Error("Original Configuration");

ユーザーが作成した工場構成の例:

var factory = new LogFactory(LogManager.Configuration);
var logger = factory.GetCurrentClassLogger();

logger.Error("Original Configuration");

var config = factory.Configuration;
var rule = config.LoggingRules.First(r => r.NameMatches("*"));
var target = config.FindTargetByName("file2");

rule.Targets.Remove(target);
factory.ReconfigExistingLoggers();
logger.Error("Temporary Configuration");

rule.Targets.Add(target);
factory.ReconfigExistingLoggers();
logger.Error("Original Configuration");

log1.txt

2015-03-16 21:46:04.5685|ERROR|ConsoleApplication.Program|Original Configuration
2015-03-16 21:46:04.5865|ERROR|ConsoleApplication.Program|Temporary Configuration
2015-03-16 21:46:04.5865|ERROR|ConsoleApplication.Program|Original Configuration

log2.txt

2015-03-16 21:45:26.4238|ERROR|ConsoleApplication.Program|Original Configuration
2015-03-16 21:45:26.4588|ERROR|ConsoleApplication.Program|Original Configuration

ソリューション

この問題の最善の解決策は、2 つのファクトリと各ファクトリに 1 つのロガーを作成することです。にサブスクライブする前に、ファクトリとロガーを初期化する必要がありますAppDomain.FirstChanceException。そうしないと、非同期操作または他のスレッドがある場合に、スレッド セーフに問題が発生します。

于 2015-03-16T20:15:26.693 に答える