2012-06-20 102 views
2

我正在使用log4net。Log4Net SmtpAppender不發送郵件

當應用程序發生錯誤時,我想發送電子郵件只是爲了發生錯誤。我應該怎麼做?

我的配置文件:

<configuration> 
    <configSections> 
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" /> 
    </configSections> 
    <log4net> 
    <appender name="SMTPAppender" type="log4net.Appender.SMTPAppender"> 
     <authentication value="Basic" /> 
     <to value="[email protected]" /> 
     <from value="[email protected]" /> 
     <username value="user" /> 
     <password value="pass" /> 
     <subject value="ERROR" /> 
     <smtpHost value="host" /> 
     <port value="25" /> 
     <lossy value="true" /> 
     <evaluator type="log4net.Core.LevelEvaluator"> 
     <threshold value="WARN" /> 
     </evaluator> 
     <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%newline%date [%thread] %-5level %logger %newline %message%newline%newline%newline" /> 
     </layout> 
    </appender> 
    <root> 
     <level value="INFO"></level> 
    </root> 
    <logger name="SMTPAppender"> 
     <level value="INFO"></level> 
     <appender-ref ref="SMTPAppender"></appender-ref> 
    </logger> 
    </log4net> 
</configuration> 

我想在NUnit的測試:

[TestFixture] 
public class TestClass 
{ 
    [Test] 
    public void Test() 
    { 
     ILog logger = LogManager.GetLogger(typeof(TestClass)); 
     logger.Error("test mail"); 
    } 
} 

我可能做錯了什麼。

編輯:

<logger name="Yuartz.Tests.TestClass"> 
    <level value="INFO"></level> 
    <appender-ref ref="SMTPAppender"></appender-ref> 
</logger> 
namespace Yuartz.Tests 
{ 
    using log4net; 
    using log4net.Config; 

    [TestFixture] 
    public class TestClass 
    { 
     [Test] 
     public void Test() 
     { 
      XmlConfigurator.Configure(); 
      var logger = LogManager.GetLogger("SMTPAppender"); 
      logger.Error("test mail"); 
      logger.Info("test mail"); 
     } 
    } 
} 
+0

如果你的日誌配置是不是在app.config中,我會建議你將它添加到那裏。並確保log4net正確配置,否則調用XmlConfigurator.Configure(); – adt

+0

請「刪除單位」 - 測試標籤。它與你的問題沒有關係 – Morten

回答

8

在你的例子中,你使用類型的全名(TestClass)來檢索你的記錄器。它將使用該名稱來解析記錄器或在未找到時創建一個新記錄器。

ILog logger = LogManager.GetLogger(typeof(TestClass)); 

如果你想這行代碼返回SMTPAppender記錄器,那麼你需要它在配置命名如下:

<logger name="Yuartz.Tests.TestClass"> 
    ... 
</logger> 

如果你不想更改配置,然後您需要通過其實際名稱檢索記錄器。以下內容返回名爲「SMTPAppender」的記錄器。

var logger = LogManager.GetLogger("SMTPAppender"); 

我的建議是隻更改配置中的名稱,並不斷按類型檢索記錄器。

還請確保您閱讀了您的配置。

log4net.Config.XmlConfigurator.Configure(); 
+3

這是正確的答案。 sinanakyazici,確保您瞭解log4net的基於命名空間的層次結構如何工作。在你的情況下,你配置了一個使用SmtpAppender的記錄器,但是將它命名爲使你的Classname不匹配。因此,您在測試中獲得的所有內容都是回退(root logger),它根本沒有appender。如果您想查看log4net配置過程中發生了什麼,請將以下內容添加到您的app.config中。 ''。有時這有助於找到與您的Xml問題。 –

+0

@Christophe Geers:我試過你說的,但我仍然沒有工作。編輯我的問題。 – sinanakyazici

+0

那麼您將記錄器重命名爲Yuartz.Tests.TestClass,即測試類的完整類型名稱。但是現在您可以使用名稱「SMPTAppender」檢索記錄器。如果您重命名記錄器,則需要按照以前的方式按類型檢索它。您可以保留名爲「SMTPAppender」的記錄器並通過該名稱檢索記錄器,或者將記錄器重命名爲您的類型名稱並按類型檢索。不要這樣做。 –

0

你打電話的地方XmlConfigurator.Configure()? 如果是這樣,有時候發送郵件很簡單,因爲反垃圾郵件抓住了它,所以如果有某些東西標記爲垃圾郵件,請確保與系統管理員確認。

相關問題