43

ロギングに NLog パッケージを使用するのはこれが初めてですが、これまでのところ、うまく機能しています。

私のシナリオでは、より一般的な構成ファイルのシナリオではなく、プログラムで NLog LoggingConfiguration 設定を初期化する必要があります。私はこれをテストし、デフォルトで希望どおりにすべて動作するようにしました。しかし、実行時にプログラムで設定を変更するにはどうすればよいでしょうか?

ここでおそらく最も一般的なシナリオは、アプリケーションのログ レベルがデフォルトで ERROR に設定されているものの、特定のモジュールでバグが発生し、エラーを追跡するためにログ レベルをより詳細なものに切り替えたいというものです。

実行時にこれらの設定を簡単に微調整できるように、小さな Web インターフェイスを作成したいと思いますが、これで正しいアプローチを取っていることを確認したいと思います。

4

7 に答える 7

77

私は1年遅れていることを知っていますが、ユーザーにロガーの動的制御を提供する必要がある同様のシナリオに遭遇しました. 幸いなことに、これは nlog を使用すると比較的簡単です。ここでは、既に作成されたロガーへのトレース レベルのログ記録を有効にしていますが、明らかに、新しいターゲット/ルールを追加したり、LoggerConfiguration をプログラムで生成されたものに完全に置き換えたりするなど、必要なことは何でもできます。

基本的な ColoredConsole nlog.config:

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <targets>
    <target xsi:type="ColoredConsole" name="c"
            layout="${longdate} ${uppercase:${level}} ${message}" />
  </targets>
  <rules>
    <logger name="*" minlevel="Error" writeTo="c" />
  </rules>
</nlog>

シンプルなコンソール アプリケーション:

public class Program 
{
  //Initialize default Logger from config file
  private static readonly Logger m_log = LogManager.GetCurrentClassLogger();

  public static Logger Log 
  {
      get { return m_log; }
  }

  public static void Main(string[] args) 
  {
    Log.Trace("You won't see me because config is at LogLevel.Error");
    EnabledTraceForAllRules();
    Log.Trace("You will see me now though!");

    //Pause console window
    Console.WriteLine("Press any key to continue...");
    Console.ReadKey(true);

    /* Prints:
    2013-05-07 16:04:22.7050 TRACE You will see me now though!
    Press any key to continue...
    */
  }

  public static void EnabledTraceForAllRules() 
  {
    foreach(var rule in LogManager.Configuration.LoggingRules)
    {
      rule.EnableLoggingForLevel(LogLevel.Trace);
    }

    //Call to update existing Loggers created with GetLogger() or 
    //GetCurrentClassLogger()
    LogManager.ReconfigExistingLoggers();
  }
}

ログ構成をプロセス外から変更する必要があり、それをプログラムで行う必要がある場合は、WCF を使用することをお勧めします。nlog を再構成するためのメソッドを提供するアプリケーションまたは Web サイトから、小さな WCF サービスを公開できます。

于 2013-05-07T20:20:19.357 に答える
8

NLog のドキュメント ( https://github.com/NLog/NLog/wiki/Configure-from-code ) で「構成 API」を見つけました。NLog アセンブリの NLog.Config 名前空間も見てください。

参照: https://github.com/NLog/NLog/wiki/Reinitialize-NLog-configuration

于 2012-05-03T08:54:51.463 に答える
0

NLog の例のほとんどは、ある種の NLog 構成ファイルを使用していますが、完全に再構成可能なプログラムによるソリューションが必要でした。純粋なコードでそれを行う場合、次のようになります。

    var conf = new NLog.Config.LoggingConfiguration();
    var consoletarget = new ColoredConsoleTarget() { Layout = "${message}" };

    conf.AddTarget("console", consoletarget);
    //conf.LoggingRules.Add(new LoggingRule("*", NLog.LogLevel.Debug, consoletarget));
    //conf.LoggingRules.Add(new LoggingRule("*", NLog.LogLevel.Info, consoletarget));
    conf.AddRuleForAllLevels(consoletarget);

    NLog.LogManager.Configuration = conf;

    var log = NLog.LogManager.GetLogger("hello");

    log.Trace("trace");
    log.Debug("debug");
    log.Info("info");
    log.Warn("warn");
    log.Error("error");
    log.Fatal("fatal");

エンド ユーザーに表示されるログ レベルを再構成する必要がある場合に備えて、いくつかのコードにコメントを残しました。(デフォルトではすべて表示されます)

于 2021-04-24T08:06:32.960 に答える