使用log4net作为参数记录loglevel

oli*_*lif 8 c# log4net

有没有办法使用log4net登录并使用LogLevel作为参数?

也就是说,而不是写作

Log.Debug("Something went wrong");
Run Code Online (Sandbox Code Playgroud)

我想写这样的东西:

Log("Something went wrong", LogLevel.Debug);
Run Code Online (Sandbox Code Playgroud)

wag*_*ghe 9

根据这里的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);
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

  • 为什么log4net这么难用?花费大量时间并且必须查阅 15 个不同的 Stack Overflow 帖子来进行基本日志记录是令人沮丧的。/咆哮 (3认同)

ant*_*han 6

在@ 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;
}       
Run Code Online (Sandbox Code Playgroud)

这些允许您拨打电话,例如:

Log.Log(Level.Debug, "Something went wrong", myException);
Run Code Online (Sandbox Code Playgroud)

或格式化的消息:

Log.Log(Level.Info, "Request took {0:0} seconds", duration.TotalSeconds);
Run Code Online (Sandbox Code Playgroud)