2010-11-29 123 views
9

我試圖使用log4j發送包含來自後臺進程的日誌語句的可通過郵件報告。我希望爲每個進程運行發送一封電子郵件,而不是每個日誌記錄的電子郵件。我查看了SMTPAppender,但沒有看到在過程完成時手動發送報告的方式。我相信TriggeringEventEvaluator可能是關鍵,但我遇到的一個問題是如何獲得TriggeringEventEvaluator實例的句柄。我被卡住了,使用log4j 1.2.14,在1.2.15中引入了SMTPAppender.getEvaluator()方法。有什麼想法嗎?我是否在正確的軌道上? SMTPAppender.close()方法在這裏發揮作用嗎?使用log4j通過SMTPAppender發送電子郵件報告

我希望能夠做到這一點:

log.info(message1); 
log.info(message2); 
log.info(message3); 
log.sendMail(); 

思考這個多一些,我想我需要澄清什麼,我希望能完成。我試圖捕獲運行石英作業的日誌記錄,並將生成的日誌作爲電子郵件發送。石英工作使得一堆服務方法調用進入各種服務。我想要包括這些服務方法執行的任何日誌記錄以及石英作業本身的日誌記錄。我想我可以做以下的事情來捕獲所有的日誌記錄,但它不起作用。

// at the beginning of quartz job 
Logger logger = Logger.getRootLogger(); 
StringWriter sw = new StringWriter(); 
WriterAppender wa = new WriterAppender(new SimpleLayout(), sw); 
logger.addAppender(wa); 

// at the end of the quartz job 
String report = sw.toString(); 
+0

大概[此帖](http://stackoverflow.com/a/42435452/1902296)可以在上面log4j屬性有幫助 – gumkins 2017-02-24 10:21:24

回答

16

您不應該使用任何log4j的方法,而應該正確地配置它。

首先,定義你的log4j.properties正確提交您的appender:

#CONFIGURE SMTP 
log4j.appender.email=org.apache.log4j.net.SMTPAppender 
log4j.appender.email.SMTPHost=mail.mydomain.com 
[email protected] 
log4j.appender.email.SMTPPassword=mypw 
[email protected] 
[email protected] 
log4j.appender.email.Subject=Log of messages 
log4j.appender.email.BufferSize=1 
log4j.appender.email.EvaluatorClass=TriggerLogEvent 
log4j.appender.email.layout=org.apache.log4j.PatternLayout 
log4j.appender.email.layout.ConversionPattern=%m 

注:從​​採取代碼。更多信息可以在SMTPAppender API獲得。

接下來,創建一個專門用於發送電子郵件的類。例如:

package com.foo.mailer; 
import org.apache.log4j.Logger; 

public class Mailer { 
    private static final Logger logger = Logger.getLogger(Mailer.class); 

    public void logMail(String mailString) { 
     logger.info(mailString); 
    } 
} 

接下來,擺在log4j.properties配置該類:

# INFO level will be logged 
log4j.logger.com.foo.mailer = INFO, email 
# turn off additivity 
log4j.additivity.com.foo.mailer = false 

現在,只要你想使用log4j的發送一封電子郵件,把這個代碼:

new Mailer().logMail("This mail should be sent"); 

免責聲明:我還沒有測試任何此代碼。

+0

,我們只能爲INFO語句唯一正確發送電子郵件。這意味着如果我有一些調試語句,它不會在電子郵件中包含這些語句嗎? – mahesh 2014-02-05 16:44:45

3

如果您使用XML配置文件,以下內容應該會有所幫助。

<appender name="ErrorEmailAppender" class="org.apache.log4j.net.SMTPAppender"> 
    <param name="SMTPHost" value="mail.mydomain.com" /> 
    <param name="SMTPUsername" value="[email protected]" /> 
    <param name="SMTPPassword" value="password" /> 
    <param name="From" value="[email protected]" /> 
    <param name="To" value="[email protected]" /> 
    <param name="Subject" value="Log of messages" /> 
    <param name="BufferSize" value="1" /> 
    <param name="EvaluatorClass" value="TriggerLogEvent" /> 
    <layout class="org.apache.log4j.PatternLayout"> 
     <param name="ConversionPattern" value="%t %m%n"/> 
    </layout> 
</appender> 

<logger name="com.foo.mailer"> 
    <level value="INFO" /> 
    <appender-ref ref="ErrorEmailAppender"/> 
</logger>