2012-04-24 30 views
21

これは初めてログを出力するためのNLogパッケージを使用していますが、これまでのところうまく動作しました。プログラムでNLogを再設定する

私のシナリオでは、より典型的な設定ファイルシナリオではなく、プログラムでNLog LoggingConfiguration設定を初期化する必要があります。私はこれをテストし、デフォルトでそれがすべての方法で動作するようにしました。しかし、実行時に設定をプログラムで変更するにはどうすればよいですか?おそらく最も一般的なシナリオは、アプリケーションのログレベルがデフォルトでERRORに設定されているが、特定のモジュールでエラーを追跡するためにログレベルをより冗長に切り替えるバグが発生する場合が考えられます。私は少しWebインターフェイスを書くので、私は簡単に実行時にこれらの設定を調整することができますが、私はこれで適切なアプローチを取っていることを確認したいと思います。

+0

minレベルを 'Trace'に変更することは、アプリケーションを再起動せずにXML設定だけで行うことができます。 – Julian

答えて

-1

アプリケーションの実行中にNLogを再構成する典型的な方法は、構成ファイル(NLog.configなど)を使用することです。ファイル内のロギング設定を定義することができ、ファイルを監視するようにNLogに指示することができます。ファイルが変更された場合(1つ以上のロガーのロギングレベルの変更など)、NLogはファイルの内容に基づいて自身を再設定します。

プログラムでNLogを構成していると述べているので、構成ファイルの変更に基づいて自身を再構成する機能には依存しません。

私はこのような何かにあなたの質問を書き直すことができます:私はコンストラクタで10に初期化するメンバ変数を持っている私のアプリケーションでは

。このメンバ変数は、アプリケーションが終了するまでループする回数を制御します。私のプログラムが実行されている間、私はこの値を変更して、より多くの回数またはより少ない回数をループさせたいと思います。実行時にメンバ変数を変更する方法を知っている人はいますか?

問題はあなたと似ています。実行中のアプリケーションの変更を外部からどのように開始するのですか?私はこれが特にNLogを使うことではないと思います。

あなたのロギング設定をどうにか外見化しない限り、この問題は解決しにくいと思います。

独自の設定ファイルやその他のファイルを使用する場合は、設定ファイルオプションを使用してNLogがすでに行っていることを基本的に複製しています。

何らかの種類のポーリングメカニズムを使用している場合(アプリケーションがある場所(ファイル、レジストリ、???)を定期的に確認してからNLog設定を変更する必要がある場合は、NLog設定を変更します。この場所に新しいログレベルが保存されていますか?アプリケーション全体に1つのロガーしかありませんか、クラスごとに1つの静的なロガーが一般的ですか?後者の場合は、どのロガーを変更したいのか、どのレベルを変更するのか

何らかの共有状態やプロセス間通信でアプリケーションと直接やりとりすることができますか?

あなたがやろうとしていることを誤解しており、実際にそれを達成するための簡単な方法があることは間違いないでしょう。

設定ファイル

  • 利点

    使いやすく

    一般的に、私は利点とdisavantagesとNLogを使用するには、2つの方法で、それぞれがあると言うでしょう。

    アプリケーションにNLog固有のコードはほとんどありません。

    アプリケーションの実行中にログ設定を変更することができます。

  • デメリット

    configファイルに追いつくために持っています。

    あなたのロギングで他の誰かが馬鹿にならないようにしたいかもしれません。

Configをプログラム的に

  • 利点

    は、設定ファイルに追いつくために持っていません。

    他の人は、あなたのロギングで簡単に惑わすことはできません。

  • デメリット

    アプリケーション内のほかのNLog固有のコード。

    アプリケーションの実行中にNLogの設定を変更することはできません。

    実際には、ソースコードを変更せずにアプリケーションをコンパイルして再コンパイルした後、NLogの設定を変更することはできません。これがすべてで助けた場合、私は知らない

...

+1

本当ですか?それは使いにくいですか?私は、ReconfigureLogger( "LoggerName")やRecofnigureAllLoggers()のような単純なメソッドがないため、変更後に現在の設定を再構築するのは謎です設定ファイルのどのように変わっていくのですか?設定を更新する必要があることをロガーに通知するconfigChangedイベントを発生させるだけの問題です。だから私は設定ファイルを使用し、リフレッシュを強制的に実行時に上書きする唯一の解決策ですか?それは本当にハッキングされた解決策のようです。 – snappymcsnap

+0

NLogログ設定をプログラムで再設定するのがどれほど簡単かどうかは難しいです。私はそれがあまりにも難しくないと思う。しかし、アプリケーションの外部から、アプリケーション内のコードがNLogを再構成する必要があると通信する方法はありますか?それは私が来た角度です。最初にログを再構成したいと思っていた実行中のアプリケーション(外部​​から)をどのように伝えるのかを想像できませんでした。私は実際には、彼らのアプリケーションを再構成可能なようにログを記録しているほとんどの人が信じています... – wageoghe

+0

...設定ファイルオプションを使用しています。 – wageoghe

53

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

基本ColoredConsole nlog。設定:

<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サービスを公開することができます。

+0

これはアンウォールとしてマークする必要があります – Julian

+0

私はこの使用法のためのwebsocketサービスを提案します、それはWcfより重くなく使いやすくなります。 – Thomas

+0

'LogManager.ReconfigExistingLoggers();'がここの鍵です。これがなければ、ロギングターゲット/ルールを追加することはできません –

関連する問題