2012-09-24 7 views
7

log4netでログを記録し、LogLevelをパラメータとして使用する方法はありますか?ログレベルをパラメータとしてlog4netでログする

代わり

Log.Debug("Something went wrong"); 

を書くの私はこのような何か書きたいと思い、次のとおりです。log4netのドキュメントhereによる

Log("Something went wrong", LogLevel.Debug); 
+0

さてあなたは、クラスを拡張することができ、私はあなたが指示する必要がありsusopectこの変更をしたい理由です。 –

+0

ほとんどの便宜のためです。私はWindowsサービスまたはコンソールアプリケーションとして実行できるアプリケーションを持っています。コンソールアプリケーションとして実行する場合、ログはファイルではなく画面に出力する必要があります。実装されているので、ロギングを行うメソッドはパラメータとしてログレベルをとります。私はおそらくlog4netのためのコンソールアペンダーを使用することができますが、私はどのようにappendersのコンパイル時に使用するかを決定する方法を知らない。 – olif

答えて

8

を(log4net.Core.ILoggerの下で見て)、あなたはログを使用することができますメソッドをILoggerインターフェイスに追加します。

private static ILog logger = 
    LogManager.GetLogger(
    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 

logger.Logger.Log(logger.GetType(),LogLevel.Debug,"Something went wrong", ex); 

タイプパラメータは、ロギングコードとアプリケーションコードの間のコールスタック内の境界を判別するためにlog4netで使用されます。メソッド名のロギングを有効にすると、スタック上のMethodInfoのDeclaringTypeが渡された型(上記のログ呼び出しの型)と等しくなるまでlog4netが呼び出しスタックをナビゲートします。 DeclaringTypeが見つかると、コールスタックの次のメソッドが実際の呼び出しメソッド(アプリケーションコード)になります。

LoggingEvent構造をとるオーバーロードを使用することもできます。

また、Logメソッドはラッパーによって使用されることが記載されています。私はそれが "情報"メッセージと見なされるべきか、それを直接使用しないことを強く示唆するべきかはわかりません。

ログメソッドを使用してすべてのロギング呼び出しを行いたい場合は、ロガーをこのようにするコードを変更できます(ログ呼び出しごとにロガープロパティを使用しないようにすることができます)。

wageogheの答え@上の拡張
private static ILogger logger = 
    LogManager.GetLogger(
    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType).Logger; 

logger.Log(logger.GetType(),LogLevel.Debug,"Something went wrong", ex); 
6

は、私は次の拡張メソッドを書いた:

Log.Log(Level.Debug, "Something went wrong", myException); 

public static bool Log(this ILog log, Level level, string message, Exception exception = null) 
{ 
    var logger = log.Logger; 
    if (logger.IsEnabledFor(level)) 
    { 
     logger.Log(logger.GetType(), level, message, exception); 
     return true; 
    } 

    return false; 
} 

public static bool LogFormat(this ILog log, Level level, string messageFormat, params object[] messageArguments) 
{ 
    var logger = log.Logger; 
    if (logger.IsEnabledFor(level)) 
    { 
     var message = string.Format(messageFormat, messageArguments); 
     logger.Log(logger.GetType(), level, message, exception: null); 

     return true; 
    } 

    return false; 
}  

これらは、次のような呼び出しを行うことができるようにの

または形式のメッセージ:

Log.Log(Level.Info, "Request took {0:0} seconds", duration.TotalSeconds); 
+0

これは私が必要としていたものです。私は日常的に1つのレベルでログを記録する必要がありますが、時にはレベルを上回って、オブジェクトをログファイル 'オンデマンド'にダンプできます。 –

+0

これは良いことですが、より柔軟にするために、最初のメソッドは 'string message'ではなく' object message'を受け入れるべきです。 – Miral

関連する問題