使用log4net以loglevel作为参数进行日志记录
有没有办法使用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);