joppot

コピペで絶対動く。説明を妥協しない

サーバ

AWSのLoad Blancer越しのアクセスをapacheのカスタムログを使用して取得し、かつfluentdで取得する方法

投稿日:2014年8月23日 更新日:

Pocket

ea09

概要

みなさんこんにちはcandleです。今回はELB越しのapacheのアクセスをカスタムログを使用した場合にfluentdで如何にして取るかを紹介します。

fluentdがapacheのaccess_logを取得するのは簡単なのですが、ELB越しのデータを取得し、それをカスタムログに収めた場合は、fluentdのフォーマットは自分で書くしかありません。
ただ、fluentdの正規表現は複雑です。

前提

AWSのEC2上でamazon linuxかCentOSでapacheサーバとfluentdサーバが同一サーバ上で構築されている。
動作確認だけしたい場合はvagrantやvmでも可能です。

ロードバラサーを使ってEC2にアクセスが来ていること。

前提がやや複雑になりましたが、様はEC2とELBを使ってapacheとfluentdサーバの環境ができていいれば可能です。

i024u0fa

SPONSORED LINK


apacheのカスタムログを設定する

apacheはデフォルトでaccess_logにウェブサーバへのアクセスを記録するのですが、残念ならが、ロードバランサーを挟むと、apacheはアクセスは全てロードバラサから来たものと判断するので、有効なアクセスログが集まりません。

そこで、カスタマイズを使うのですが、カスタマイズすると、今度はfluentdがapacheのログを取得しようとすると、フォーマットが合わずに取得できなくなってしまうので、独自フォーマットを作る必要があります。それをやっていきます。

まずはapacheのカスタムログの設定から。

サーバにsshでアクセスして、/etc/httpd/conf/httpd.confをエディタで開きます。

LogFormatの記述がある500行目辺りに下の内容を貼り付けます。

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %D %{X-Forwarded-For}i %{X-Forwarded-Proto}i"  elb-customlog
CustomLog "|/usr/sbin/rotatelogs /var/log/httpd/myservice/access_log.%Y%m%d 86400" elb-customlog env=!nolog

customconf

設定は次の様になっています。普通のアクセスログのフォーマットに加えて、%D %{X-Forwarded-For}i %{X-Forwarded-Proto}iを加えています。

rotatelogsを使って/var/log/httpd/myservice/の中に「acccess_log.年月日」というファイルを生成してカスタムログを保存します。なぜ普通のaccess_logのように1つのファイルで管理しないかというと、ロードバラサを使っているサービスとも成るとものすごいサービスかもしれません。そうなった時、1つのファイルにだけ書き込んでいては大変です。そこで、アクセスログを年月日で分割して管理するのです。

カスタムログの設定を見ると、/var/log/httpd/フォルダの中にmyserviceとうフォルダを作っていますね。先にこのフォルダを作っておきます。

sudo mkdir /var/log/httpd/myservice/

apacheのカスタムログの設定ができました。

apacheのカスタムログができるか確認する

apacheを起動して、サーバにアクセスして、カスタムログができるか確認しましょう。

sudo service httpd start

起動したのでサーバにアクセスします。
mysite

カスタムログのパスに移動します。

cd /var/log/httpd/myservice/
ls

中身を確認しましょう。あいにく、この記事を書いている環境はvagrantのCentOSなので、
詳しいデータは出てきませんが。一応うまくいっているっぽいです。

make_custom_log

itokyougetlog

もしも、AWSのEC2上で同じ設定をして、ロードバラサ経由でサーバにアクセスすれば、問題なくデータがとれます。IPアドレスなどの関係でちょっと例を出すことはできませんが、恐らくできます。

 

fluentdでapacheのカスタムログを取得する設定

fluentdの設定ファイルをまだ作成していない場合は下のコマンドで作成しましょう。

sudo mkdir /etc/fluent/
sudo chown root:`whoami` /etc/fluent/
sudo chmod 775 /etc/fluent/
  
cd /etc/fluent/
fluentd --setup ./

一般にapacheの/var/log/httpdの中は権限がrootのみに与えられており、ログインユーザーからはアクセス出来ないようになっています。もしも、fluentdをログインユーザーとして実行する場合はfluentdは/var/log/httpd/の中にアクセスできません。

もちろん、本番環境を考えるとfluentdは自動起動になっていると思うのでrootユーザでfluentdが起動されているから問題はないでしょう。しかし、練習の段階ではわざわざfluentdを自動起動にするとテストが面倒なので、httpdの中の権限を変更します。

sudo chown root:`whoami` /var/log/httpd/
sudo chmod 750 /var/log/httpd/

次に、やや面倒ですが、テストの段階では/var/log/httpd/myservice/にその日のファイルがapacheのカスタムログによって作成されてから下のコマンドでログインユーザーからアクセスできるようにしましょう。

sudo chown root:`whoami` /var/log/httpd/myservice/access_log."`date '+%Y%m%d'`"

先ほども書きましたが、apacheの独自のログフォーマットを作成した場合は、fluentd側もそれに対応した正規表現でフォーマットを作る必要があります。
下のソースがfluentdでapacheのカスタムログを取得する記述です。
/etc/fluent/fluent.confを開いてコピペしましょう。

<source>
  type tail
  path /var/log/httpd/myservice/access_log.%Y%m%d
  tag custom_apache.access
  pos_file /var/log/fluent/custom_access_log.pos
  format /^(?<host>[^ ]*) [^ ]* (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^ ]*) +\S*)?" (?<code>[^ ]*) (?<size>[^ ]*)(?: "(?<referer>[^\"]*)" "(?<agent>[^\"]*)" (?<response_time_micro_sec>[^ ]*) (?<access_ip_address>[^ ]*) (?<access_protocol>[^ ]*))?$/
time_format %d/%b/%Y:%H:%M:%S %z
</source>

<match custom_apache.access>
 type file
  path /var/log/fluent/custom_apache_access
  time_slice_format %Y%m%d
  time_slice_wait 1s
  compress gzip
</match>

ソースはpathでapacheのカスタムログがある場所を参照します。取得したデータはcustom_apache.accessというタグを付けます。posファイルを/var/log/fluent/に置いて、取ってきたデータをformatの正規表現に従って、ソートします。ちなみにtime_formatを上の様に設定しないとエラーがでます。実際あれがなにをやっているか自分もわかりません。

matchのところで取得し、ソートしたデータを受け取って、/var/log/fluent/にcustom_apache_accessという形で日にち別でファイルを分けて保存します。

もしも、/var/log/にfluentフォルダがない場合は先に作成しておきましょう。

sudo mkdir /var/log/fluent/
sudo chown root:`whoami` /var/log/fluent/
sudo chmod 770 /var/log/fluent/

fluentdの設定は以上です。

 

fluentdとapacheを動かしてログを取る

では、実際にサーバを起動してロードバラサ越しのアクセスログをとってみましょう。

始めにapacheを起動します。

sudo service httpd start

次に、fluentdを起動します。

fluentd -c /etc/fluent/fluent.conf -vv

するとfluentdが待機モードになるので、その画面は置いておいておきます。

ブラウザでサーバにアクセスしましょう。
commentspa

コンソールの別のウィンドウを開いて、custom_apache_accessのログがfluentdでとれているか確認します。

cd /var/log/fluent/

もしも「custom_apache_access.20140822.bfa130598788113a4」みたいなのが作られていれば成功です。

chekccustomfluentlog

中身を見てみて、jsonになっているか確認します。
先ほども書いた様に、この記事中はローカルのvagrant環境で動いているので、カスタムログの肝心のところは空ですが、AWSの本番環境ではしっかりログが取れています。

出来ましたでしょうか?

まとめ

今回の記事はかなり難しい処理をまとめています。私もこれだけやるのに1周間位かかりました。もしもわからない点や質問などがあればコメント欄にお願いします。

スポンサードリンク

「為になったなぁ」と思ったら、シェアお願いします。

-サーバ
-, ,

執筆者:


comment

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

関連記事

railsのfluent-logger gemを使ってユーザーのアクセスをfluentdサーバに収集する

概要 みなさんこんにちはcandleです。前回からfluentd関連の記事を続けていますが、今回辺りから実用的な使い方を書いていきたいと思います。 fluentdと言えば、ビックデータで扱うようなデー …

railsのaws-sdk gemを使ってs3のファイルを削除する

by martinak15 概要 みなさんこんにちはcandleです。今回はs3にアップロードされている画像ファイルをrailsのaws-sdk gemを使用して削除してみたいと思います。 記事中で開 …

ec2からvimをアンインストールして削除する

概要 みなさんこんにちはcandleです。 今回はec2のデフォルトで入っているvimを削除してみたいと思います。 emacs使いの私としてはvimは、まぁ、いらないと考えました。 もちろんviが入っ …

ubuntuでnginxの起動と最低限のコマンド

概要 今回は、nginxの起動と最低限のコマンドをまとめました。 前提 nginxがインストールされている nginxの起動と停止と再起動 nginxはインストールした当初の設定ではubuntuを起動 …

ruby on railsで出力されるlog(ログ)のフォーマットを変更する

概要 みなさんこんにちはcandleです。今回はrailsのログに関する記事です。railsは決まった記述でログを出力します。 webアプリケーションを実行中におかしな挙動が合った場合はこのログをもと …

  • English
  • 日本語

プロフィール


ベンチャー企業のCTOをやってます。大学時代にプログラミングを始め、javaから入門し、C++へて、PHPへと進み、会社ではRailsを使用。自動化が大好きなプログラマー

スポンサードリンク

アーカイブ