Log4Net SmtpAppender for WebEmail - Not Sending
Asked Answered
P

2

8

I'm trying to get Log4Net working with web email, either Yahoo or Gmail. If you have this working, I would appreciate some help, and thanks in advance.

I've got a default root logger, with a RollingFileAppender and an SmtpAppender. The file appender is working fine. The SmtpAppender is giving me nothing.

I am calling the logger from a diagnostic button click...

protected void btnReloadContractConfig_Click(object sender, EventArgs e)
{
    // DIAGNOSTIC - Test email logger
    log4net.ILog logger = log4net.LogManager.GetLogger("root");
    logger.Error("btnReloadContractConfig_Click() - This is a TEST of delivery of error messages via email, triggered from the Admin.aspx.cs code file.");
}

...and the RollingFileAppender is getting the message...

LOC=20120921-12:03:16.319,UTC=20120921-11:03:16.319,DELTA=10078,THR=6,ERROR,LOG=root,[(null)] - btnReloadContractConfig_Click() - This is a TEST of delivery of error messages via email, triggered from the Admin.aspx.cs code file.

The web.config entries for Log4Net are here::

  <appSettings>
    <add key="log4net.Internal.Debug" value="true"/>        
  <appSettings>


  <log4net 
    xsi:noNamespaceSchemaLocation="http://csharptest.net/downloads/schema/log4net.xsd" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <root>
      <level value="DEBUG" />
      <appender-ref ref="LogFileAppender" />
      <appender-ref ref="SmtpAppender" />
    </root>

    <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender">
      <file value="MiniMkt01Log.txt"/>
      <!-- <file value="${TMP}\log-file.txt" /> -->
      <appendToFile value="true" />
      <rollingStyle value="Size" />
      <maxSizeRollBackups value="10" />
      <maximumFileSize value="10MB" />
      <staticLogFileName value="true" />
      <layout type="log4net.Layout.PatternLayout" >
    <header value="[Header]&#13;&#10;" />
    <conversionPattern value="LOC=%date{yyyyMMdd-HH:mm:ss.fff},UTC=%utcdate{yyyyMMdd-HH:mm:ss.fff},DELTA=%timestamp,THR=%thread,%-5level,LOG=%logger,[%property{NDC}] - %message%newline" />
      </layout>  
    </appender>

    <appender name="SmtpAppender" type="log4net.Appender.SmtpAppender">
      <to value="[email protected]" />
      <from value="[email protected]" />
      <subject value="Logging Message" />
      <smtpHost value="smtp.yahoo.com" />
      <port value="25"/>
      <authentication value="Basic" />
      <username value="[email protected]"/>
      <password value="?????[real password hidden for obvious reasons]"/>
      <!-- <EnableSsl value="true" /> -->
      <bufferSize value="10" />
      <lossy value="true" />
      <evaluator type="log4net.Core.LevelEvaluator">
    <threshold value="WARN"/>
      </evaluator>
      <layout type="log4net.Layout.PatternLayout">
    <header value="[Header]&#13;&#10;" />
    <!-- Previously... <conversionPattern value="%newline%date,%utcdate,%timestamp,[%thread],%-5level,%logger,[%property{NDC}] - %message%newline%newline%newline" /> -->
    <conversionPattern value="%newlineLOC=%date{yyyyMMdd-HH:mm:ss.fff},UTC=%utcdate{yyyyMMdd-HH:mm:ss.fff},DELTA=%timestamp,THR=%thread,%-5level,LOG=%logger,[%property{NDC}] - %message%newline%newline%newline" />
      </layout>
    </appender>

  </log4net>

The web.config is being picked up in the Global.asax file, in the Application_Start() handler...

void Application_Start(object sender, EventArgs e) 
{
    // Start Log4Net, signal app has started
    log4net.Config.XmlConfigurator.Configure();
    log4net.ILog logger = log4net.LogManager.GetLogger("root");
    logger.Info("Application_Start()");
}

The admin web page that triggers the email attempt seems to either hang indefinitely, or hang momentarily (half second) and continue.
The dev environment does not collapse with an exception, it's either hang or glide on without error.

  • How do I get additional diagnostics out of the SmtpAppender?
  • Can I independently test the port/config to check for a local block on outgoing programmatic email?
  • Is a log4net email guaranteed to be sent? The lossy and bufferSize properties seem very sensitive, if I put lossy=false, I get an indefinite hang...

For reference I am using VS 2010, ASP.Net4, and lots of caffeine. Thanks again for any forthcoming help.

Perni answered 21/9, 2012 at 11:57 Comment(0)
P
13

OK, figured it out and am now receiving emails. I couldn't find many solutions on the Internets, so here's what I had to do.

I first set up a tiny console email program to validate that I could do basic email sending from my machine. This requires you to add a section to your web.config (or app.config in this case) that configures the SMTP client.

When I got that working, and I could send emails from the stand-alone app, I copied the required section into my main project's web.config file, and, hot-diggity-dog, it worked. Here, just out of pure love for my fellow humans, is the system.net section that worked for me with Gmail...

<configuration>

[... your config stuff]

  <system.net>
    <mailSettings>
      <smtp deliveryMethod="Network" from="[email protected]">
        <network
          host="smtp.gmail.com"
          enableSsl="true"
          port="587"
          userName="[email protected]"
          password="yesThisIsMyRealPasswordIAmAnIdiot"
          defaultCredentials="false"/>
      </smtp>
    </mailSettings>
  </system.net>

[... some more of your config stuff]

</configuration>

So that was the key, I had no system.net section in my .config file, hence epic fail. Hope this helps someone else out in future.

Perni answered 24/10, 2012 at 13:53 Comment(3)
Can you post what your log4net settings looked like for the SmtpAppender here? Curious what combination I need here.Skimmia
Looks like the host, port, username & password elements of the smtp appender are completely redundant. I removed them from my appender and it happily uses the system.net/mailSettings/smtp config.Pelias
Exactly. I also found that I could use HMailServer installed locally on my server to act as the SMTP relay, which has helped. I now have reliable email logging.Perni
N
2

For gmail you have to set EnableSsl to true. You need log4net version 1.2.11.0 to be able to do this. Also, for testing purposes, you can set bufferSize to 1, i.e. every log will be written.

Also for testing purposes you can try to configure log4net programmatically like:

public class TestingLog4Net
{
    public void TestSmtpAppender()
    {
        ConfigureLog4NetSmtp();
        var logger = GetLogger();

        logger.Fatal(new Exception("Testing"));
    }

    private static ILog GetLogger()
    {
        var logger = LogManager.GetLogger(typeof (TestSmtpAppender));
        return logger;
    }

    private static void ConfigureLog4NetSmtp()
    {
        var smtp = GetSmtpAppender();
        BasicConfigurator.Configure(smtp);
    }

    private static SmtpAppender GetSmtpAppender()
    {
        var smtp = new SmtpAppender
                       {
                           Name = "GMail",
                           Username = "your_user_name",
                           Password = "your_password",
                           SmtpHost = "smtp.gmail.com",
                           From = "[email protected]",
                           To = "[email protected]",
                           EnableSsl = true,
                           Port = 587,
                           Authentication = SmtpAppender.SmtpAuthentication.Basic,
                           Subject = "Testing log4net SmtpAppender",
                           BufferSize = 1,
                           Lossy = true,
                           Evaluator = new LevelEvaluator(Level.Fatal),
                           Layout =
                               new PatternLayout(
                               "%newline%date [%thread] %-5level %logger [%property{NDC}] - %message%newline%newline%newline")
                       };
        return smtp;
    }
}

Download LinqPad the latest beta version. Choose C# program as LinqPad query and copy past the above code to the query. Use your gmail account and set some target email address. This should work.

Nickolenicks answered 28/9, 2012 at 7:36 Comment(3)
log4net:ERROR [SmtpAppender] ErrorCode: GenericFailure. Error occurred while sending e-mail notification. System.Net.Mail.SmtpException: The SMTP server requires a secure connection or the client was not authenticated. The server response was: 5.5.1 Authentication Required.Perni
I am guessing the enableSsl setting is not working. Are you using the compiled binary DLL of 1.2.11, or building yourself? I'm using the DLL.Perni
Got the source code and built 1.2.11 locally - no joy. Tried a build with NET_2_0. No joy. I get the feeling I am missing something obvious.Perni

© 2022 - 2024 — McMap. All rights reserved.