Playframeworkでログサーバへログを出力する

2012.10.16

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

アプリケーションを開発する際に、ログ情報は必ず必要とされます。
開発時はデバッグ情報を、本番運用時にもトラブル解決のための情報や分析のための重要な情報になります。
最近行ったプロジェクトの話になりますが、ログ出力について考える必要がありました。
APサーバ1台で運用するならローカルにログを出力しておけば特に問題ないですが、クラスタリング環境で運用することになったので、
ログを1箇所にまとめて出力することにしました。
今回はPlayframeworkでLog4Jを使ってログ専用サーバにログを出力してみます。

環境構築

今回使用した動作環境は以下のとおりです。

  • OS : MacOS X 10.7.4
  • Play framework : 1.2.4
  • log4j : 1.2.17

Log4JとSocketAppender

Log4Jはログ出力用のJavaライブラリで、現在はApacheソフトウェア財団のプロジェクトになっています。
以前はログライブラリ=Log4Jというくらいよく使用されていました。現在はLog4Jの開発が止まっていることもあり、
SLF4JやLogpackなどもよく使用されているようです。(・・・と思いましたが、Log4Jは今年10月に2.0-beta2がリリースされているようです)

PlayframeworkではLog4Jをデフォルトで使用しており、application.confで設定するだけでそのまま使用することができます。
ここで簡単にLog4Jの説明をします。
Log4JはプロパティファイルかXMLファイルで設定が可能で、ロガー、アペンダ、レイアウトを定義できます。
ロガーでは取得するログのレベル(ERRORやINFOなど)を設定し、レイアウトは出力するログの形式を整形するために参照されます。
アペンダでは具体的な出力処理を行います。アペンダにはいろいろな種類があり、ファイルへ出力するFileAppenderやコンソールに出力するConsoleAppenderなど、
用途にあったアペンダを指定します。
今回はリモートのLog4Jサーバに対してログを出力するので、SocketAppenderを使用します。

SocketAppender設定方法

まずはapplication.confでlog4j設定用ファイルを指定します。
今回はSocketAppenderを非同期で動かすため、xml形式でなくてはいけません。

application.log.path=/log4j.xml
application.log.system.out=off

次にlog4j.xmlファイルを作成し、設定を記述します。
SOCKETアペンダでログサーバのIPアドレスとポートを指定します。
また、ASYNCアペンダも定義します。このアペンダはappender-refで指定したアペンダを非同期で実行します。

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="true">
   <appender name="ASYNC" class="org.apache.log4j.AsyncAppender">
      <appender-ref ref="SOCKET"/>
   </appender>

   <appender name="SOCKET" class="org.apache.log4j.net.SocketAppender">
      <param name="Port" value="<ポート番号>"/>
      <param name="RemoteHost" value="<ログサーバのIPアドレス>"/>
      <param name="ReconnectionDelay" value="0"/>
   </appender>

   <root>
      <priority value="INFO"/>
      <appender-ref ref="ASYNC"/>
   </root>
</log4j:configuration>

アプリケーション側の準備ができたので、最後にログサーバ側の準備を行います。
ログサーバ側ではLog4Jサーバを稼働して待受けておきます。log4Jには SocketServerクラスとSimpleSocketServerクラスが用意されているので、
これを実行すればサーバが起動します。 まずはlog4jサーバ用の設定ファイル(my.lcf)を用意しましょう。通常のlog4jの設定です。

#my.lcf
log4j.rootLogger=INFO, A1
log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A1.File=./logs/app_log
log4j.appender.A1.DatePattern='.'yyyy-MM-dd
log4j.appender.A1.Append=true
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%d [%p]%m%n

[/bash]

そしてログサーバへlog4jのjarファイルを用意し、javaコマンドでSimpleSocketServerクラスを実行しましょう。
指定する設定ファイルはさきほど記述した設定ファイルです。

% java -cp ./log4j-1.2.17.jar  org.apache.log4j.net.SimpleSocketServer <PORT番号> ./my.lcf

これでログサーバが起動しました。SocketAppenderを指定したアプリケーションでlog4jを使用すると、ログサーバへ出力されます。
こうしておけば、APサーバが増えてもすべてログサーバへ出力されるのでログの管理が簡単になりますね。