相关疑难解决方法(0)

Log4net创建自定义级别

我知道可以使用带有log4net INFO,WARN,ERROR和FATAL消息的内置级别

是否有可能创造新的?

logging log4net

11
推荐指数
2
解决办法
1万
查看次数

ILogger.Log方法declaringType参数

当我想使用log4net提供的不同日志记录级别时,我发现我需要使用方法ILogger.Log,如下所示:

void Log(Type callerStackBoundaryDeclaringType, Level level, object message, Exception exception);
Run Code Online (Sandbox Code Playgroud)

我们可以从我们通常的ILog引用中获取ILogger引用来调用此方法,并且通常建议将此调用包装在扩展方法中.我们得到的是以下内容:

//typical log4net ILog reference
private static readonly ILog Logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);

//suggested extension method
public static void Trace(this ILog logger, object message, Exception e)
{
    logger.Logger.Log(MethodBase.GetCurrentMethod().DeclaringType, log4net.Core.Level.Trace, message, e);
}
Run Code Online (Sandbox Code Playgroud)

我注意到获取声明类型的反射调用看起来多余.当我们检索到ILog引用时,我们已经将声明类型传递给GetLogger.为什么我们需要将另一个类型引用传递给方法Log,我们在ILogger引用上调用它,我们从ILog引用中检索了它.更重要的是,扩展方法中的声明类型将是包含扩展方法的类.使用类似Log4NetExtensions的类名记录所有Trace日志是没有意义的.最后,反射应该是昂贵的,即使反映当前方法可能更便宜,每次我们记录时调用反射代码听起来都不对.所以我决定做一个测试:

//I just created a logger
var logger = logManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);

//and then I called Log with different type parameters
logger.Logger.Log(MethodBase.GetCurrentMethod().DeclaringType, log4net.Core.Level.Info, "hello!", null);
logger.Logger.Log(logger.GetType(), log4net.Core.Level.Info, "hello!", null);
logger.Logger.Log(null, log4net.Core.Level.Info, "hello!", null);
logger.Logger.Log(typeof(System.Console), log4net.Core.Level.Info, "hello!", null);
Run Code Online (Sandbox Code Playgroud)

结果日志如下所示:

INFO  2015-05-29 11:06:57,200 …
Run Code Online (Sandbox Code Playgroud)

c# log4net

8
推荐指数
1
解决办法
2642
查看次数

标签 统计

log4net ×2

c# ×1

logging ×1