2015-02-09 137 views
1

我有我的C#應用​​程序成功安裝log4net。一切工作正常,當我做到這一點,除了:Log4net不記錄異常

catch (Exception ex) 
{ 
    if (log.IsErrorEnabled) 
     log.Error("test", ex); 
} 

我得到的消息「測試」,我沒有得到例外的。然後,當我這樣做:

catch (Exception ex) 
{ 
    if (log.IsErrorEnabled) 
     log.Error(ex); 
} 

我得到的異常,所需的,堆棧跟蹤和一切。這工作,但理想情況下,我想同時具有消息和例外。

爲什麼完全相同的代碼(無配置更改)在第一個示例中不起作用,但它在第二個示例中有效?我是否閱讀Error()方法的文檔錯誤?

+0

你使用哪個Appender? – Filburt 2015-02-09 23:46:22

+0

RollingFileAppender,我玩過的模式,格式等。它應該打印例外默認情況下(我讀過),但上面的代碼不 – landoncz 2015-02-09 23:47:34

+0

你可以顯示你的配置 – stuartd 2015-02-09 23:57:26

回答

0

嘗試

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

這工作!我得到異常和堆棧跟蹤和一切。任何想法爲什麼錯誤(字符串,異常)方法不起作用? – landoncz 2015-02-09 23:46:47

+0

它可能與你的appender配置有關。不知道但很高興它爲你工作! :) – 2015-02-10 00:18:26

+0

@landoncz基於此解決方案爲您工作,它看起來像您試圖使用的重載預期將「ex」轉儲到第一個參數中提供的「string.format」模板中,並且由於沒有包含一個「{0}」,它被簡單地忽略了。 – Scott 2015-02-10 00:21:57

1

您使用第一個重載是你想要的:Error(string, Exception)。如果實際寫入的異常取決於您的appender和/或您選擇的佈局。下面說明如何禁用堆棧跟蹤打印:https://stackoverflow.com/a/3660529/106567

我需要查看您的配置以便說明爲什麼不會打印異常。

「有效」的代碼實際上並不是你應該做的:log.Error(ex)似乎是做你想做的事情,因爲log4net把這個異常作爲消息對象並簡單地調用toString()。任何專門處理異常的appender /佈局都無法正確處理異常。如果使用ErrorFormat重載之一(實際上我從來沒有完全理解,爲什麼不能同時使用格式化的字符串和異常),也會發生同樣的情況。

+0

log4net將如何區分格式字符串參數和異常..? – stuartd 2015-02-10 13:30:34

+0

通過使Exception成爲第一個參數。像這樣:錯誤(Exception ex,String message,params Object [] args)與錯誤(String message,params Object [] args) – 2015-02-10 13:38:31

+0

確實如此,但在參數列表中有消息和異常交換是不直觀的 - ''錯誤(字符串消息)'和'錯誤(字符串消息,異常異常)'和'ErrorFormat(字符串消息,params對象[] args)'但是然後'ErrorFormat(異常ex,字符串消息,params對象[] args) - 可以始終將其實施爲擴展方法。 – stuartd 2015-02-10 14:19:02