我已成功为我的C#应用程序设置了log4net。一切正常,除非我这样做:
catch (Exception ex)
{
if (log.IsErrorEnabled)
log.Error("test", ex);
}
我得到的只是信息" test",我根本没有得到例外。然后,当我这样做时:
catch (Exception ex)
{
if (log.IsErrorEnabled)
log.Error(ex);
}
我根据需要获得异常,堆栈跟踪和所有内容。这很有效,但理想情况下,我希望同时拥有消息和异常。
为什么完全相同的代码(没有配置更改)在第一个示例中不起作用,但在第二个示例中却起作用?我在阅读Error()方法的文档错误吗?
答案 0 :(得分:2)
您正在使用的第一个重载是您想要的重载:Error(string, Exception)
。如果实际写入异常取决于您的appender和/或您选择的布局。下面介绍如何禁用堆栈跟踪的打印:https://stackoverflow.com/a/3660529/106567
我需要查看您的配置,以便说明为什么不打印异常。
“工作”的代码实际上并不是你应该做的:log.Error(ex)
似乎做你想要的,因为log4net将异常视为消息对象,只是在其上调用toString()。任何专门处理异常的appender / layout都无法正确处理异常。如果您使用ErrorFormat
重载之一(实际上我从未完全理解,为什么您不能同时使用格式化字符串和异常),也会发生同样的情况。
答案 1 :(得分:1)
解决方案与我发布的代码无关,但我没有正确修复标记。最终解决方案已在this stack overflow post
中找到答案 2 :(得分:0)
尝试
log.ErrorFormat("test: {0}", ex);