サーブレット 3章 サーブレットの基本2
- 3.1. Webアプリケーション全体の初期設定値の読み出し
- 3.2. ログの書き込み
- 3.3. HTTPヘッダーの取り扱い
3.2. ログの書き込み
ログの書き込みはGenericServletの「log」メソッドか、ServletContextの「log」メソッドを使用します。初期設定の読み出しと異なり、同じ動作をするようにできていますので前者を利用する方が便利です。
public class SampleServlet extends HttpServlet{ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException,IOException{ log("Get Method is called"); ....
「log」メソッドには以下の2種類があります。
void log(String) void log(String, Throwable)
前者は引数で指定されたメッセージのみが出力されます。後者はメッセージに加えて、例外をトレースした内容が出力されます。
さてこれらのログですが、どのファイルに出力されるのでしょうか。それについては「WEB-INF/web.xml」で設定するのではなく、サーブレット・コンテナによって実装が異なります。Tomcatの場合は、「conf/server.xml」の設定で決まります。以下に関係のある部分を抜粋しています。
<Host name="localhost" debug="0" appBase="webapps" unpackWARs="true"> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log." suffix=".txt" pattern="common" /> <Logger className="org.apache.catalina.logger.FileLogger" directory="logs" prefix="localhost_log." suffix=".txt" timestamp="true" /> <Context path="/sample" docBase="SampleApp" reloadable="true"> <Logger className="org.apache.catalina.logger.FileLogger" prefix="sampleapp" suffix=".log" timestamp="true" /> </Context> </Host>
アプリケーション毎に出力するログを設定したい場合は、該当する<Context>タグ内に<Logger>タグを記述します。prefix属性でログファイルの先頭部分、suffix属性でログファイルの拡張子を指定します。timestamp属性で「true」を指定すると、ログファイルが日毎で分けられ、その名前に日時が加わるようになります。directory属性でログファイルのディレクトリを指定できますが、省略すると「logs」ディレクトリが指定されたことになります。className属性は他と同じ、「org.apache.catalina.logger.FileLogger」としてください。
<Logger>タグを省略した場合は、ホスト全体で設定しているログファイルに出力されます。例の場合は<Valve>タグに続いている、<Logger>タグで指定したログファイルに出力されます。
(実習課題2)
実習課題1を改良しなさい。
- それぞれのメソッドの先頭で、必ずログに出力を行うこと。
- 例外が発生したときにも、ログに出力を行なうようにする事。
- わざと例外が発生する状況にし、例外がどのようにログに出力されるか確認すること。