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="FacelessDevTeam@yahoo.com" />
      <from value="hiblet@yahoo.com" />
      <subject value="Logging Message" />
      <smtpHost value="smtp.yahoo.com" />
      <port value="25"/>
      <authentication value="Basic" />
      <username value="FacelessDevTeam@yahoo.com"/>
      <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.

4

2 に答える 2

13

OK、それを理解し、現在メールを受信して​​います。私はインターネット上で多くの解決策を見つけることができなかったので、これが私がしなければならなかったことです。

私は最初に小さなコンソール電子メールプログラムをセットアップして、自分のマシンから基本的な電子メール送信を実行できることを検証しました。これには、SMTPクライアントを構成するセクションをweb.config(この場合はapp.config)に追加する必要があります。

それが機能し、スタンドアロンアプリからメールを送信できるようになったとき、必要なセクションをメインプロジェクトのweb.configファイルにコピーすると、hot-diggity-dogが機能しました。ここに、私の仲間の人間への純粋な愛から、Gmailで私のために働いたsystem.netセクションがあります...

<configuration>

[... your config stuff]

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

[... some more of your config stuff]

</configuration>

それが鍵でした。.configファイルにsystem.netセクションがなかったため、epicは失敗しました。これが将来誰か他の人を助けることを願っています。

于 2012-10-24T13:53:58.957 に答える
2

Gmailの場合、EnableSslをtrueに設定する必要があります。これを行うには、log4netバージョン1.2.11.0が必要です。また、テストの目的で、bufferSizeを1に設定できます。つまり、すべてのログが書き込まれます。

また、テストの目的で、次のようにプログラムでlog4netを構成することもできます。

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 = "your_sender@gmail.com",
                           To = "some_target@mail.com",
                           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;
    }
}

LinqPadの最新のベータ版をダウンロードします。LinqPadクエリとしてC#プログラムを選択し、上記のコードをコピーしてクエリにコピーします。Gmailアカウントを使用して、ターゲットのメールアドレスを設定します。これは機能するはずです。

于 2012-09-28T07:36:43.147 に答える