前に作成した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
メールは日本語に対応していない為、文字化けします。
