2011-02-20 14 views
7

私は、このような「DBLOG」など、いくつかの新しいものを定義するだけDBLOGですべてのログを設定することができるようにしたいトレース、情報、致命的などNlogとカスタムレベル

ようNLogに組み込み、いくつかのログレベルがあります知っています特定のターゲットをターゲットとすることができます。

これを行う方法はありますか?または私はカスタムログを定義する必要がありますか?

答えて

20

@SemVanmeenenが正しい場合、NLogではカスタムレベルの追加(LogLevelクラスで使用可能な値の拡張)ができません。さらに、少なくともNLogでは、レベルの仕方に応じて、各レベルは一般的にメッセージの優先度を示します。したがって、エラーおよびそれ以上のレベルのメッセージのみを記録するように構成されたロガーがある場合、Trace、Debug、Info、およびWarnメッセージはログに記録されません。 DBLogのレベルはどこに合っていますか?それは、レベルではなく、「カテゴリ」(ロガー名にいくぶん類似している可能性があります)のほうが多いようです。

本当に "DBLog"のようなログに特別なレベル(または複数)が必要ですか?なぜ "DBLog"という設定ファイルに別のロガーを定義するだけではないのですか?そうすれば、フィルタリングとターゲットを使って特定のターゲットにログを送信したり、そのログをオンまたはオフにすることができます。 See this link for some examples of stuff you can do with NLog configuration.

NLogで最も一般的なパターンの一つとlog4netのは、クラスごとにロガーを持つことである、このように:

class MyClass 
{ 
    private static readonly Logger logger = LogManager.GetCurrentClassLogger(); 

    public void DoSomething(int x, int y); 
    { 
    logger.Info("Doing something. x = {0}, y = {1}", x, y); 

    //Or 

    logger.Log(LogLevel.Info, "Doing something. x = {0}, y = {1}", x, y); 
    } 
} 

また、任意のロガーの名前を使用することができますで

class MyDbClass 
{ 
    private static readonly Logger logger = LogManager.GetLogger("DbStuff"); 

    public void DoSomething(int x, int y); 
    { 
    logger.Info("Doing something. x = {0}, y = {1}", x, y); 

    //Or 

    logger.Log(LogLevel.Info, "Doing something. x = {0}, y = {1}", x, y); 
    } 
} 

class MyOtherDbClass 
{ 
    private static readonly Logger logger = LogManager.GetLogger("DbStuff"); 

    public void DoSomething(int x, int y); 
    { 
    logger.Info("Doing something. x = {0}, y = {1}", x, y); 

    //Or 

    logger.Log(LogLevel.Info, "Doing something. x = {0}, y = {1}", x, y); 
    } 
} 

を2番目の例では、両方のクラスが同じロガー( "DbStuff")を使用しており、そのロガー名に基づいて両方のクラスを制御できます(ロギングレベル、ターゲットなど)。

同じクラス内で異なるロガーを使用することもできます(デフォルトでは、クラスごとのロガースタイルを使用することもできます)。同様の情報を簡単にログと制御できるようにするためにクラス間で)。 「SQL」または「PERFORMANCE」というロガーがあり、クラスレベル以外のレベルで制御したい特定の情報をログすることがあります。

異なるロガー名を使用すると、新しいログレベルを定義せずにロギングメッセージを異なるターゲットに確実にルーティングできます。

これが役に立たない場合は、あなたがしたいことについて正確にあなたの質問を精緻化することができます。どのような種類のログコードを書くことができますか?

[UPDATE]

<logger name="Name.Space.Class1" minlevel="Debug" writeTo="f1" /> 
<logger name="Name.Space.Class1" levels="Debug,Error" writeTo="f1" /> 
<logger name="Name.Space.*" writeTo="f3,f4" /> 
<logger name="Name.Space.*" minlevel="Warn" writeTo="f3,f4" /> 
<logger name="Name.Space.*" minlevel="Debug" maxlevel="Error" final="true" /> 

はF1、F2、F3、F4とは、ファイルの標的であると仮定します。

1行目は、Class1用のロガーがデバッグ以上のレベルのメッセージに対してf1ターゲットに書き込むようにします(つまり、トレースはスキップされます)。

2行目は、Class1のためのロガーがONLYデバッグおよびエラーレベルメッセージ(すなわちトレース、情報、警告し、そして致命的はスキップされます)

3行目にはすべてのためのロガーの原因となりますF1ターゲットに書き込みますネームスペースのクラスName.Spaceに関係なく、ターゲットf3とf4に書き込むためのスペース。ログレベルが警告する以上

(すなわち、トレース、デバッグ、および情報はスキップされます)である場合にのみ

4行目は、目標F3とF4に書き込むために名前空間Name.Spaceにすべてのクラスのロガーが発生します5行目は、名前空間Name.Spaceのすべてのクラスのロガーが、レベルがDebugとErrorの間にあるメッセージをすべて拒否します。 writeTo句がないため、これらは拒否されます。 final=true

これらの例では、ロガーレベルでフィルタする方法を示しているため、ロガーのルールは処理されません。 FilteringTargetWrapperを使用して、ターゲットレベルでさらにフィルタリングを行うことができます。私はそれを使用していないが、ここでFilteringTargetWrapperを構成した例があります:
Most useful NLog configurations

私はNLog 1.0リフレッシュインストールに付属のヘルプファイルのうち、これらの例を得ました。私はプロジェクトの途中にあり、NLog 2.0がベータテストから外れるまで待つことを好むので、NLog 2.0をまだインストールしていません。 NLog 2.0を使用していて、ヘルプファイルにNLog Webサイトよりも優れた例がない場合は、少なくともNLog 1.0ヘルプをインストールすることを検討することがあります。あなたはここでNLog 1.0のヘルプを得ることができます:http://nlog.codeplex.com/releases/view/32601

+0

私はそれぞれの "接続オブジェクト"のためのロガーを作ったサーバーに接続しています。私はlogger.traceとlog.warnをします。警告を表示せずにトレース(のみ)? – Stacker

+1

設定ファイルでロガーを設定すると、それぞれのminLevel、maxLevel、またはdiscreteレベルを設定できます。したがって、ロガー "A"の場合は、トレースメッセージのみを記録し、ロガー "B"の場合はログメッセージのみを記録するように設定することができます(または警告する)。私は私の答えにいくつかの例を追加します。 – wageoghe

+0

「クロスカッティング」ロガーの場合+1 –

0

私が知る限り、不可能です。 nlogのThe log level classにはパブリックコンストラクタがなく、静的なログレベルオブジェクト(つまり、通常の情報、トレースなど)のみが定義されています。

しかし、ターゲットだけでは不十分な理由はありますか?