2014-02-05 46 views
1

我想在完成java任務後只發送一次電子郵件給電子郵件組。如何用log4j發送電子郵件SMTP appender

在log4j屬性中,我可以發送電子郵件,但會觸發每個日誌語句的電子郵件。

但我的要求是,在所有任務完成後發送電子郵件,這意味着啓動Java程序,做一些處理,將有多個日誌語句,然後發送電子郵件。

以下是我的log4j smtp屬性列表。

#log4j.rootLogger=DEBUG, sendMail 
#log4j.appender.stdout=org.apache.log4j.ConsoleAppender 
#log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 
#log4j.appender.stdout.layout.ConversionPattern=[%5p] %d{mm:ss} (%F:%M:%L)%n%m%n%n 
#log4j.appender.sendMail=org.apache.log4j.net.SMTPAppender 
##log4j.appender.sendMail.Threshold=WARN 
#[email protected] 
#[email protected] 
#log4j.appender.sendMail.SMTPHost=10.13.16.57 
#log4j.appender.sendMail.Subject=Log4J Message 
#log4j.appender.sendMail.layout=org.apache.log4j.PatternLayout 
#log4j.appender.sendMail.layout.ConversionPattern=%p %t %c - %m%n 
#log4j.appender.sendMail.BufferSize=1 
#log4j.appender.sendMail.SMTPDebug=true 
+0

由於您不想爲每條日誌語句發送電子郵件 - 最後只有一封電子郵件,您有什麼理由說明您使用Log4J來完成此任務嗎?你會不會更好地使用Spring的'JavaMailSender'? –

+0

Hi Will Keeling,我不想爲每個日誌發送電子郵件,因爲我正在驗證不同的URL和文件夾權限,並且批量作業必須每40分鐘發送一次電子郵件。所以肯定發送每個日誌的單獨電子郵件在我看來並不好。你能不能給我一些洞察JavaMailSender – mahesh

回答

0

在XML中定義您的log4j配置並添加一個記錄器元素作爲記錄器名稱。

看到log4j XML formatLog4j config

<appender name="SmtpAppender" type="log4net.Appender.SmtpAppender"> 
    <to value="[email protected]" /> 
    <from value="[email protected]" /> 
    <subject value="test logging message" /> 
    <smtpHost value="SMTPServer.domain.com" /> 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%newline%date [%thread] %-5level %logger [%property{NDC}] - %message%newline%newline%newline" /> 
    </layout> 
</appender> 
<logger name="sendMail" additivity="false"> 
    <level value="info" /> 
    <appender-ref ref="mailAppender" /> 
</logger> 

在您的代碼:

private static Logger LOG_MAIL = Logger.getLogger("sendMail"); 
+0

沒有XML格式,它可以做到嗎?就像在log4j.properties文件中一樣? .properties文件中目前有log4j屬性。但我的問題是我只想發送一次電子郵件。此配置會發送一次電子郵件還是每個LOG_MAIL.log發送電子郵件? – mahesh

+0

@mahesh是的,你可以。您已經定義了根記錄器。添加另一個像'log4j.sendMail = mailSender'。這應該做的伎倆。 – Hannes

+0

對不起,我沒有添加另一個?你的意思是另一個rootLooger或appender? – mahesh

0

既然你要在批量運行結束時發送一封電子郵件,你可能會更好聚合所有的將消息放入某種大字符串中,然後使用Spring的JavaMailSender發送一封電子郵件。

您可以用發送電子郵件JavaMailSender找到various articles但本質上你需要在你的Spring配置首先配置它的一個實例:

<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl"> 
    <property name="host" value="mail_host"/> 
    <property name="port" value="25"/> 
    <property name="username" value="mail_username"/> 
    <property name="password" value="mail_password"/> 
    <property name="javaMailProperties"> 
     <props> 
      <prop key="mail.smtp.auth">true</prop> 
     </props> 
    </property> 
</bean> 

然後在您的客戶端(批處理作業或不管它發生在可以),可以爲JavaMailSender指定的自動裝配Autowired場:

@Autowired 
private JavaMailSender mailSender; 

然後這純粹是在創建和發送消息的情況下:

SimpleMailMessage message = new SimpleMailMessage(); 
message.setTo(to); 
message.setSubject(subject); 
message.setText(body); // Your aggregated messages 
mailSender.send(message); 

這就是基礎知識 - 但您會發現很多其他文章和文檔在網絡中更詳細地討論它。