Log4jを使用して、バックグラウンドプロセスからのログステートメントを含む電子メールで送信可能なレポートを送信しようとしています。ロギングステートメントごとに1通ではなく、プロセスの実行ごとに1通のメールを送信したい。 SMTPAppender
を見ましたが、プロセスの完了時に手動でレポートを送信する方法がわかりません。 TriggeringEventEvaluator
が鍵になると思いますが、私が直面している問題の1つは、TriggeringEventEvaluator
インスタンスへのハンドルを取得する方法です。 log4j 1.2.14を使用してスタックし、SMTPAppender.getEvaluator()
メソッドが1.2.15で導入されました。何かご意見は?私も正しい方向に進んでいますか?ここでSMTPAppender.close()
メソッドが機能しますか?
私はこれができるようになりたいです:
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();
Log4jのメソッドは使用しないでください。代わりに、適切に構成する必要があります。
まず、log4j.properties
ファイルでアペンダーを適切に定義します。
#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");
免責事項:このコードはテストしていません。
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>
Log4j 2.x以降では、log4j.xmlに対して次の構成を使用できます。これは非常に簡単で、メールの送信に使用できます。
それを編集して、SMTPホスト、ユーザー名、パスワード、ポート、および件名を入力する必要があります。
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<SMTP>
<name>Mail1</name>
<subject>SUBJECT</subject>
<to>TO_EMAIL</to>
<from>FROM_EMAIL</from>
<smtpHost>smtp.gmail.com</smtpHost>
<smtpPort>487</smtpPort>
<ignoreExceptions>false</ignoreExceptions>
<smtpUsername>username</smtpUsername>
<smtpPassword>password</smtpPassword>
<smtpProtocol>smtps</smtpProtocol>
<HtmlLayout charset="UTF-8" locationInfo="true" />
<ThresholdFilter level="ERROR"/>
</SMTP>
</Appenders>
<Loggers>
<Root level="INFO">
<AppenderRef ref="Mail1"/>
</Root>
</Loggers>
</Configuration>