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

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次の記事

MavenでSeasar2アプリ作成