有没有一种方法可以使用log4net记录日志,并将LogLevel作为参数?
也就是说,不是写成这样
Log.Debug("Something went wrong");
我想写出这样的代码:
Log("Something went wrong", LogLevel.Debug);
有没有一种方法可以使用log4net记录日志,并将LogLevel作为参数?
也就是说,不是写成这样
Log.Debug("Something went wrong");
我想写出这样的代码:
Log("Something went wrong", LogLevel.Debug);
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来确定日志代码和应用程序代码之间的调用栈边界。如果启用了方法名称记录,log4net会沿着调用栈向上导航,直到栈上的MethodInfo的DeclaringType等于传入的Type(Log调用中的Type)为止。当它找到该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);
object message
而不是string message
。 - Miral