Log4Net SmtpAppender不发送邮件

sin*_*ici 2 c# log4net

我正在使用log4net.

当应用程序出错时,我想发送电子邮件只是为了出错.我该怎么办?

我的配置文件:

<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
  </configSections>
  <log4net>
    <appender name="SMTPAppender" type="log4net.Appender.SMTPAppender">
      <authentication value="Basic" />
      <to value="xxx@xxx" />
      <from value="yyy@yyy" />
      <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>
Run Code Online (Sandbox Code Playgroud)

我想在NUnit中测试:

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

我可能做错了什么.

编辑:

<logger name="Yuartz.Tests.TestClass">
  <level value="INFO"></level>
  <appender-ref ref="SMTPAppender"></appender-ref>
</logger>
Run Code Online (Sandbox Code Playgroud)
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");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Chr*_*ers 8

在您的示例中,您使用类型的全名(TestClass)来检索记录器.它将使用此名称来解析记录器或在未找到时创建新记录器.

ILog logger = LogManager.GetLogger(typeof(TestClass));
Run Code Online (Sandbox Code Playgroud)

如果您希望这行代码返回SMTPAppender记录器,那么您需要在配置中重命名它,如下所示:

<logger name="Yuartz.Tests.TestClass">
    ...
</logger>
Run Code Online (Sandbox Code Playgroud)

如果您不想更改配置,则需要按实际名称检索记录器.以下命令返回名为"SMTPAppender"的记录器.

var logger = LogManager.GetLogger("SMTPAppender");
Run Code Online (Sandbox Code Playgroud)

我的建议是只更改配置中的名称,并按目前的类型继续检索记录器.

还要确保您已阅读配置.

log4net.Config.XmlConfigurator.Configure();
Run Code Online (Sandbox Code Playgroud)

  • 这是正确的答案.sinanakyazici,确保您了解log4net的基于命名空间的层次结构如何工作.在您的情况下,您配置了一个使用SmtpAppender的记录器,但将其命名为您的Classname不匹配.因此,您在测试中得到的只是后备(root logger),它根本没有appender.如果要查看log4net配置过程中发生的情况,请将以下内容添加到app.config中.`<appSettings> <add key ="log4net.Internal.Debug"value ="true"/> </ appSettings>`.有时这有助于发现Xml的问题. (3认同)