2010-11-29 21 views
9

log4jを使用して、バックグラウンドプロセスからのロギングステートメントを含むemailableレポートを送信しようとしています。私は各プロセスの実行ごとに1つの電子メールを送信し、各ロギングステートメントの電子メールは1つではありません。私はSMTPAppenderを見ましたが、プロセスが完了したときにレポートを手動で送信する方法はありません。私はTriggeringEventEvaluatorが鍵かもしれないと信じていますが、私が実行している問題の1つは、TriggeringEventEvaluatorインスタンスへのハンドルを取得する方法です。私はlog4j 1.2.14を使用して立ち往生しており、SMTPAppender.getEvaluator()メソッドが1.2.15で導入されました。何かご意見は?私は正しい軌道にいるのだろうか? 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

答えて

16

あなたは、あなたの代わりにそれを適切に設定する必要があり、log4jの者のいずれかの方法を使用しないでください。

#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 

注:​​から取られたコード

まず第一に、あなたのlog4j.properties正しくアペンダをファイルに定義します。詳細はSMTPAppender APIで入手できます。

次に、電子メールを送信するためだけに使用される特別なクラスを作成します。例:このクラスのlog4j.properties構成で入れ

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); 
    } 
} 

次に、:今すぐ

# 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文のための電子メールを送信することができます。それは私がいくつかのデバッグstmtsを持っている場合、それは電子メールの権利のそれらのステートメントを含まないことを意味する? – mahesh

+1

'mailer'クラスを' logMail() 'メソッドで使用するのは確実ではありません...これは、ソフトウェアを実行しているユーザに配送の選択を任せず、ソフトウェアにはこれらのlog4jがそれに応じて構成されていない場合、ログメッセージは電子メールで配信されます。私は配信不能システムとしてlog4jメソッド(.debug()、.info()、...)を参照し、log4j設定を使用してフィルタリングを実行し、配信方法(ファイル、電子メール、... )あなたに合った。 – Julien

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> 
関連する問題