前に作成したStruts2.2+Springアプリにlog4jでINFO以上のログをファイルに出力し、ERROR時はメールを送信するようにしてみました。
そもそもStruts2ではActionのERRORがfalseに設定されているので、画面のみでコンソールにすら表示されなかったので、この辺の対応に苦労しました。
JARを追加
/pom.xmlを右クリックして[Add Dependency]
log4j -> log4j -> 1.2.16 javax.mail -> mail -> 1.4.4
下記のエラーが出たので、
Missing artifact log4j:log4j:bundle:1.2.16:compile
/pom.xmlのtypeタグを削除
<dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.16</version><type>bundle</type></dependency>
設定変更
/src/main/resources/log4j.xmlを追加
※SMTPHostはローカルのSMTPが存在する想定。FromとToには受信したいアドレスを設定する。
ちなみに標準ではSMTP認証等には対応していないみたい。
あと、_hostname_にサーバ名を入れておくとどのサーバから来たか解るので便利かな。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender"> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%-5p %d [%t] %m%n"/> </layout> </appender> <appender name="FILE" class="org.apache.log4j.DailyRollingFileAppender"> <param name="File" value="/var/log/tomcat/struts2.log"/> <param name="Append" value="true"/> <param name="DatePattern" value="'.'yyyy-MM-dd"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n"/> </layout> </appender> <appender name="MAIL" class="org.apache.log4j.net.SMTPAppender"> <param name="SMTPHost" value="localhost" /> <param name="From" value="hoge@hogehoge.com"/> <param name="To" value="hoge@hogehoge.com"/> <param name="Subject" value="struts2 report in _hostname_"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n"/> </layout> </appender> <root> <priority value="INFO"/> <appender-ref ref="CONSOLE"/> <appender-ref ref="FILE"/> <appender-ref ref="MAIL"/> </root> </log4j:configuration>
ちなみにこの設定ではDEBUGログは出力されません。
出力するにはlog4j.xmlのINFOをDEBUGに変更します。
開発環境ではDEBUGレベルでFILEやMAILはない方が良いかも。
<priority value="INFO"/> <appender-ref ref="CONSOLE"/> <appender-ref ref="FILE"/> <appender-ref ref="MAIL"/> ↓ <priority value="DEBUG"/> <appender-ref ref="CONSOLE"/>
/src/main/resources/struts.xmlを変更
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <省略> <package name="default" extends="struts-default" namespace="/"> <interceptors> <interceptor-stack name="DefaultStack"> <interceptor-ref name="exception"> <param name="logEnabled">true</param> <param name="logLevel">ERROR</param> </interceptor-ref> </interceptor-stack> </interceptors> <default-interceptor-ref name="DefaultStack" /> </package> </struts>
/src/main/java/ap/actions/IndexAction.javaを変更(action毎に設定が必要)
上記のstruts.xmlで定義したpackageを参照させるようにします。
※赤字は実際の設定。青字は動作確認用です。
package ap.actions; import org.apache.log4j.Logger; import org.apache.struts2.convention.annotation.ParentPackage; import org.springframework.beans.factory.annotation.Autowired; <省略> @ParentPackage(value = "default") public class IndexAction extends ActionSupport { /** Logger. */ private static Logger logger = Logger.getLogger(IndexAction.class); <省略> public String execute() throws Exception { // 動作確認 logger.debug("[IndexAction]DEBUGログ"); logger.info("[IndexAction]INFOログ"); logger.error("[IndexAction]ERRORログ"); <省略> } <省略> }
/src/main/java/ap/service/impl/MessageServiceImpl.javaを変更(service.impl毎に設定が必要)
package ap.service.impl; import org.apache.log4j.Logger; import org.springframework.stereotype.Service; <省略> public class MessageServiceImpl extends ActionSupport implements MessageService { /** Logger. */ private static Logger logger = Logger.getLogger(MessageServiceImpl.class); <省略> public String getMessage() { // 動作確認 logger.debug("[MessageServiceImpl]DEBUGログ"); logger.info("[MessageServiceImpl]INFOログ"); logger.error("[MessageServiceImpl]ERRORログ"); return getText(MESSAGE); } }
動作確認
http://localhost:8080/struts2/
※コンソールとファイルとメールに「ERRORログ」が表示されればOK
メールは日本語に対応していない為、文字化けします。