log4net でログを記録し、LogLevel をパラメーターとして使用する方法はありますか?
つまり、書く代わりに
Log.Debug("Something went wrong");
私はこのようなものを書きたいと思います:
Log("Something went wrong", LogLevel.Debug);
ここの log4net ドキュメント(以下をlog4net.Core.ILogger
参照) によると、ILogger インターフェイスで Log メソッドを使用できます。
private static ILog logger =
LogManager.GetLogger(
System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
logger.Logger.Log(logger.GetType(),LogLevel.Debug,"Something went wrong", ex);
Type パラメーターは、ログ コードとアプリケーション コードの間のコール スタック内の境界を決定するために、log4net によって使用されます。メソッド名のログ記録を有効にしている場合、スタック上の MethodInfo の DeclaringType が渡された Type (上記の Log 呼び出しの Type) と等しくなるまで、log4net はコール スタックを上に移動します。DeclaringType が検出されると、コール スタック内の次のメソッドが実際の呼び出しメソッド (アプリケーション コード) になります。
LoggingEvent
構造体を取るオーバーロードを使用することもできます。
ドキュメントには、Log メソッドはラッパーによって使用されることを意図していると書かれています。それが「情報」メッセージと見なされるべきか、それとも直接使用しないようにという強い提案と見なされるべきかはわかりません。
Log メソッドを介してすべてのロギング呼び出しを行いたい場合は、ロガーを取得するコードを次のように変更できます (そのため、すべての Log 呼び出しで Logger プロパティを使用する必要がなくなります)。
private static ILogger logger =
LogManager.GetLogger(
System.Reflection.MethodBase.GetCurrentMethod().DeclaringType).Logger;
logger.Log(logger.GetType(),LogLevel.Debug,"Something went wrong", ex);
@wageoghe の回答を拡張して、次の拡張メソッドを作成しました。
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.Debug, "Something went wrong", myException);
またはフォーマットされたメッセージ:
Log.Log(Level.Info, "Request took {0:0} seconds", duration.TotalSeconds);