[英]Log with log4net with the loglevel as parameter
有沒有辦法使用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);
log4net使用Type參數來確定日志代碼和應用程序代碼之間的調用堆棧中的邊界。 如果啟用了方法名稱日志記錄,則log4net將向上導航調用堆棧,直到堆棧上MethodInfo的DeclaringType等於傳入的類型(上面的日志調用中的類型)。 當它發現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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.