Process.Start()& log4net的

时间:2015-02-05 09:40:41

标签: c# log4net

我的程序会发送电子邮件。我可以选择让用户测试它是否有效。该计划有两个部分: 用户设置配置的配置窗口。它没有参数执行。 和发送消息,在控制台中执行,带有3个参数(@to,subject,message)。

我正在使用log4net。

这是代码(在我的表格中)。我正在调用相同的程序,但有3个参数:

var to = inputBox.mailValue;
ProcessStartInfo processInfo = new ProcessStartInfo();
processInfo.FileName = "Mailer.exe";     
processInfo.Arguments = to + " Test " + "\"This is a test message sent by Mailer.exe\""; 
processInfo.UseShellExecute = false;
processInfo.RedirectStandardOutput = true;
processInfo.RedirectStandardError = true;
Process proc = Process.Start(processInfo);
proc.WaitForExit();
if(proc.ExitCode == 0)
    MessageBox.Show("A test message has been sent to " + to + ".\nCheck your inbox & mailerLOG.txt file", "Message sent", MessageBoxButtons.OK, MessageBoxIcon.Information); 
else if(proc.ExitCode < 0)
    MessageBox.Show("An error ocurred. Check mailerLOG.txt file for more details.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 

一切正常,邮件已发送,但不会记录在mailerLOG.txt上 发送邮件时,我会这样做:

logger.Info("Message with subject <" + mail.Subject + "> has been sent to <" + mail.To + ">");

如果发生错误,它既不会记录。

我失踪了什么?

我的log4net配置。 (它在我的程序的其余部分正常工作)

<configuration>
    <configSections>      

        <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>  
    </configSections>

    <log4net>
      <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
        <target value="Console.Error" />
        <layout type="log4net.Layout.SimpleLayout" />
      </appender>
      <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">  
        <file value="MailerLOG.txt"/>
        <appendToFile value="true"/>
        <rollingStyle value="Composite"/> 
        <datePattern value="yyyyMMdd"/>        
        <maxSizeRollBackups value="5"/>
        <maximumFileSize value="5MB"/>        
        <staticLogFileName value="true"/>
        <layout type="log4net.Layout.PatternLayout">  
          <conversionPattern value="[%date] [%-5level]: %message%newline"/>  
        </layout>
        <filter type="log4net.Filter.LevelRangeFilter">  
          <levelMin value="INFO"/>
        </filter>
      </appender>
      <root> 
        <level value="DEBUG"/>
        <appender-ref ref="ConsoleAppender" />
        <appender-ref ref="RollingFileAppender"/> 
      </root>         
    </log4net>

<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0,Profile=Client"/></startup>
</configuration>

1 个答案:

答案 0 :(得分:2)

这段代码对我来说很突出:

if(proc.ExitCode == 0)
    MessageBox.Show("A test message has been sent to " + to + ".\nCheck your inbox & mailerLOG.txt file", "Message sent", MessageBoxButtons.OK, MessageBoxIcon.Information); 
else if(proc.ExitCode < 0)
    MessageBox.Show("An error ocurred. Check mailerLOG.txt file for more details.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);

您没有介绍proc.ExitCode > 0的情况,这很重要,因为许多应用程序返回1作为其标准错误代码。尝试删除第二个if,以便您的代码如下所示:

if(proc.ExitCode == 0)
    MessageBox.Show("A test message has been sent to " + to + ".\nCheck your inbox & mailerLOG.txt file", "Message sent", MessageBoxButtons.OK, MessageBoxIcon.Information); 
else
    MessageBox.Show("An error ocurred. Check mailerLOG.txt file for more details.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);

一般来说,在记录错误时,您不想假设该程序将执行的操作。如果你需要知道什么时候出错了,最好不要猜出发生错误时会是什么样子 - 相反,检查它是否是正确的行为(这应该更容易分辨)然后有一些东西将抓住所有其他并记录它,以防万一。