Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Log4net未记录异常_C#_Log4net - Fatal编程技术网

C# Log4net未记录异常

C# Log4net未记录异常,c#,log4net,C#,Log4net,我已经成功地为我的C#应用程序设置了log4net。一切正常,除了我这样做: catch (Exception ex) { if (log.IsErrorEnabled) log.Error("test", ex); } catch (Exception ex) { if (log.IsErrorEnabled) log.Error(ex); } 我得到的只是消息“test”,我根本没有得到异常。然后,当我这样做时: catch (Exceptio

我已经成功地为我的C#应用程序设置了log4net。一切正常,除了我这样做:

catch (Exception ex)
{
    if (log.IsErrorEnabled)
       log.Error("test", ex);
}
catch (Exception ex)
{
    if (log.IsErrorEnabled)
       log.Error(ex);
}
我得到的只是消息“test”,我根本没有得到异常。然后,当我这样做时:

catch (Exception ex)
{
    if (log.IsErrorEnabled)
       log.Error("test", ex);
}
catch (Exception ex)
{
    if (log.IsErrorEnabled)
       log.Error(ex);
}
我根据需要获得异常、堆栈跟踪和所有内容。这是可行的,但理想情况下,我希望同时包含消息和异常

为什么完全相同的代码(没有配置更改)在第一个示例中不起作用,但在第二个示例中却起作用?我读错了Error()方法的文档了吗?

试试看

log.ErrorFormat("test: {0}", ex);

您使用的第一个重载是您想要的:
Error(string,Exception)
。是否实际写入异常取决于附加器和/或您选择的布局。下面解释了如何禁用stacktrace的打印:

我需要查看您的配置,以便说明为什么不打印异常


“有效”的代码并不是您真正应该做的:
log.Error(ex)
似乎做了您想要做的事情,因为log4net将异常视为消息对象,并简单地对其调用toString()。任何专门处理异常的附加器/布局都无法正确处理异常。如果使用一个
ErrorFormat
重载,也会发生同样的情况(实际上,我一直不太明白,为什么不能同时使用格式化字符串和异常)

该解决方案与我发布的代码无关,但我没有正确修复标志。最终的解决方案已经在

您使用的Appender中找到了?RollingFileAppender,我已经使用了模式、格式等。默认情况下,它应该打印异常(我已经阅读),但是上面的代码没有显示您的configYes,我一回到主页就会显示我的配置computer@landoncz如果我的解决方案适合您,请选择作为答案。谢谢你的工作!我得到异常和堆栈跟踪以及所有东西。你知道为什么这个错误(字符串,异常)方法不起作用吗?它可能与你的appender配置有关。不确定,但很高兴它对你有用!:)@landoncz基于此为您提供的解决方案,看起来您尝试使用的重载会将“ex”转储到第一个参数中提供的
string.format
模板中,并且由于没有包含
{0}
,它只是被忽略了。log4net如何区分格式字符串参数和异常..?将异常作为第一个参数。类似于:Error(异常ex,String message,params Object[]args)和Error(String message,params Object[]args)这是真的,但是在参数列表中交换消息和异常将是不直观的-
Error(String message)
Error(String message,异常)
ErrorFormat(字符串消息,参数对象[]args)
但随后
错误格式(异常示例,字符串消息,参数对象[]args)
-始终可以将其作为扩展方法来实现。这很公平,但不需要这样。如果有异常,则它是第一个参数,如果没有异常,则消息是第一个参数。ErrorFormat将不是必需的:Error(string)、Error(string,object[])、Error(exception,string)、Error(exception,string)、Error(exception,string,object[]).也许这并不吸引所有人,但对我来说已经足够好了:-)我实际上已经按照Stefan在我的log4net包装库中的建议做了。很好。