log4netでログを記録し、LogLevelをパラメータとして使用する方法はありますか?ログレベルをパラメータとしてlog4netでログする
代わり
Log.Debug("Something went wrong");
を書くの私はこのような何か書きたいと思い、次のとおりです。log4netのドキュメントhereによる
Log("Something went wrong", LogLevel.Debug);
log4netでログを記録し、LogLevelをパラメータとして使用する方法はありますか?ログレベルをパラメータとしてlog4netでログする
代わり
Log.Debug("Something went wrong");
を書くの私はこのような何か書きたいと思い、次のとおりです。log4netのドキュメントhereによる
Log("Something went wrong", LogLevel.Debug);
を(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);
は、私は次の拡張メソッドを書いた:
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);
これは私が必要としていたものです。私は日常的に1つのレベルでログを記録する必要がありますが、時にはレベルを上回って、オブジェクトをログファイル 'オンデマンド'にダンプできます。 –
これは良いことですが、より柔軟にするために、最初のメソッドは 'string message'ではなく' object message'を受け入れるべきです。 – Miral
さてあなたは、クラスを拡張することができ、私はあなたが指示する必要がありsusopectこの変更をしたい理由です。 –
ほとんどの便宜のためです。私はWindowsサービスまたはコンソールアプリケーションとして実行できるアプリケーションを持っています。コンソールアプリケーションとして実行する場合、ログはファイルではなく画面に出力する必要があります。実装されているので、ロギングを行うメソッドはパラメータとしてログレベルをとります。私はおそらくlog4netのためのコンソールアペンダーを使用することができますが、私はどのようにappendersのコンパイル時に使用するかを決定する方法を知らない。 – olif