簡體   English   中英

使用log4net作為參數記錄loglevel

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM