質問: ### 前提 以下の構成でWebシステムを構築しています。 * Tomcat7 * commons-logging-1.1.1 以下、log4j.propertiesの内容です。system.logファイルにログを出力しています。 ``` log4j.appender.consoleLog=org.apache.log4j.ConsoleAppender log4j.appender.consoleLog.Target=System.out log4j.appender.consoleLog.layout=org.apache.log4j.PatternLayout log4j.appender.consoleLog.layout.ConversionPattern=[%d{yyyy/MM/dd HH:mm:ss}][%p][%c{1}] %m%n log4j.appender.fileLog=org.apache.log4j.RollingFileAppender log4j.appender.fileLog.File=C:/tmp/system.log log4j.appender.fileLog.layout=org.apache.log4j.PatternLayout log4j.appender.fileLog.layout.ConversionPattern=<%d> %m%n ``` ### 実現したいこと `Exception.printStackTrace`や、JSP構文エラーなど、標準エラー出力の内容を、system.logファイルに出力したいです。 理由は、アプリに関するログ情報を1ファイルにまとめたいからです。 現在、標準エラー出力はTomcatのログファイルに出力されます。 アプリでエラーや問題が発生した場合、まずsystem.logを確認して、問題の原因が分からなかったらTomcatのログを確認します。 この手順が、以下の点で面倒です。 * ファイルの置き場所が異なる2つのファイルを確認しなくてはいけない * Tomcatログには他のアプリの情報も出力されていて、分かりづらい。(現在Tomcatに複数のアプリがデプロイされている) ソースでは、`e.printStackTrace();`を、`log.error(message, e);`に置き換えて、stackTraceはsystem.logに出力しています。 なので、通常Tomcatログを確認することはありません。 が、やっぱり標準エラー出力をsystem.logに出力して、1ファイルにまとめたいです。 ご存知でしたら教えてください。よろしくお願いします。
回答: 未検証ですが、「org.apache.jasper.JasperException」の発生等、Exceptionが明確になっているようであれば、JSP例外処理用サーブレット・フィルタを実装し、フィルタ内でcatchしてsystem.logにExceptionを出力する方法はいかがでしょうか。 ※`Exception.printStackTrace()`は`log.error()`に書き換える今のルールが良いと思います。 以下、`doFilter()`のイメージです。 ``` public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException{ try { chain.doFilter(request,response); } catch ([対象となるException] e) { log.error("JSPエラー発生", e); // 上位へ再スロー, 必要に応じて共通エラー画面へ遷移などに変更。。。 throw e; } } ```