NLog で動的にログの出力状況を変更する

設定のオンオフで,ログを出力するかどうかを変えたり,出力先 (ファイルや TextBox など) を変更したい場合。

たとえば 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">
  <targets>
    <target name="file" xsi:type="File" fileName="${basedir}/app.log"/>
  </targets>
</nlog>

target は定義されているけど rule は定義されていないので,このままではログはどこにも出力されていない。

この状況で上記の file target にログを出力するように変更するには,

using NLog;
using NLog.Config;

NLog.Targets.Target target = LogManager.Configuration.FindTargetByName("file");
LoggingRule rule = new LoggingRule("*", LogLevel.Debug, target);

LogManager.Configuration.LoggingRules.Clear();
LogManager.Configuration.LoggingRules.Add(rule);
LogManager.ReconfigExistingLoggers();

のようにする。

LogManager.Configuration.LoggingRulesList<LoggingRule> なので,List ジェネリックスのメソッドを使って操作すればよい。ただし操作しただけだとすでに生成されてしまっているロガーには (その設定変更が) 伝わらないので LogManager.ReconfigExistingLoggers() する必要がある。