Apacheログの見やすい解析方法

Apache サーバー 飯田意己

お久しぶりです。

最近案件でログの解析をすることが増えました。

・なんか見れないページがある!なにが起こっているのか確認したい
・あるユーザーが会員登録を失敗しているかもしれない、そのユーザーのページ遷移を確認したい
・(負荷分散をおこなっているサイトで)アクセスがきちんと分散されているか調べたい

といった、問題の原因追及のために裏側を詳しく調べるときに役立ちます。

でも、普段ログなんて触れたことがない方にはだいぶハードルが高いですよね。
いきなり調べてって言われて右往左往したディレクターの方いらっしゃるのではないでしょうか。

そんなとき!こうやれば、手元にあるものでなんかいいかんじにログが整理できます!という方法をご紹介します。

1.そもそもログってなんぞや

Apacheのログです。
アクセスログとかエラーログです。
アクセスしてきた人の情報、どんなエラーがおこったかという情報を確認することができます。
今回はローカルエリアのサーバーにアクセスしていろいろ見てみました。

2.用意するもの

・ターミナル(teratermとか)
・FTPクライアント(WinSCPとか)
・置換機能のあるテキストエディタ(秀丸とか)
・エクセル

3.どこにあんの?

ログの設定はApacheの設定ファイル(httpd.conf)に書いてあります。
なので、httpd.confの場所を調べて、ログがどこに出力されているか調べます。

ターミナルを立ち上げてサーバーに接続してください。

lacate httpd.conf

このコマンドでApacheの設定ファイルの場所を探します。
findより早く見つけてくれます。

[yo-iida@localhost ~]$ locate httpd.conf
/etc/httpd/conf/httpd.conf

httpd.confの場所がわかりました。

httpd.confからlogの設定の記述を抽出します。
以下のコマンドで抽出できると思います。
・アクセスログ

cat /etc/httpd/conf/httpd.conf | grep "CustomLog"

・エラーログ

cat /etc/httpd/conf/httpd.conf | grep "ErrorLog"

/etc/httpd/conf/httpd.confの内容から”指定文字列”を含む行だけを表示するという意味です。

・アクセスログ

[yo-iida@localhost ~]$ cat /etc/httpd/conf/httpd.conf | grep "CustomLog"
# a CustomLog directive (see below).
#CustomLog logs/access_log common
#CustomLog logs/referer_log referer
#CustomLog logs/agent_log agent
CustomLog logs/access_log combined
#    CustomLog logs/dummy-host.example.com-access_log common

・エラーログ

[yo-iida@localhost ~]$ cat /etc/httpd/conf/httpd.conf | grep "ErrorLog"
# ErrorLog: The location of the error log file.
# If you do not specify an ErrorLog directive within a 
ErrorLog logs/error_log
#    ErrorLog logs/dummy-host.example.com-error_log

上記の行頭に#が付いているものはコメント行です。
アクセスログはlogs/access_log、エラーログはlogs/error_logにあるみたいですね。

でもここで書かれているのは相対パスなのでApacheのルートを調べる必要があります。

cat /etc/httpd/conf/httpd.conf | grep "ServerRoot"

これでApacheのルートを調べます。

[yo-iida@localhost logs]$ cat /etc/httpd/conf/httpd.conf | grep "ServerRoot"
# with "/", the value of ServerRoot is prepended -- so "logs/foo.log"
# with ServerRoot set to "/etc/httpd" will be interpreted by the
# ServerRoot: The top of the directory tree under which the server's
ServerRoot "/etc/httpd"

はい、でました。

ログの場所は以下になります。
アクセスログ:/etc/httpd/logs/access_log
エラーログ:/etc/httpd/logs/error_log

4.ログをDLしよう

WinSCPでサーバーに接続して上記で探したログファイルをローカルにダウンロードしましょう。
winscp

5.テキストエディタでひたすら置換処理

さきほどのファイルを秀丸で開きます。
texteditor1

ログは基本何千行もあり、目的の情報を探すのが大変です。
その中には無駄な情報、いらない情報も多く含まれています。

今回はHTMLの遷移だけをみたいと仮定してHTML以外の行を消してしまいます。
次の置換処理をかけてみましょう。

1.置換前:「.*js HTTP\/1\.1.*\n」、置換後:「」
2.置換前:「.*css HTTP\/1\.1.*\n」、置換後:「」
3.置換前:「.*gif HTTP\/1\.1.*\n」、置換後:「」
4.置換前:「.*png HTTP\/1\.1.*\n」、置換後:「」
5.置換前:「.*jpg HTTP\/1\.1.*\n」、置換後:「」
6.置換前:「.*ico HTTP\/1\.1.*\n」、置換後:「」

これらは画像やCSS、JSのログを削除する正規表現です。
置換する場合はこのように正規表現が大変役に立ちます。
ログだけでなく、テキストを扱ういろいろな場面で業務効率があがりますので、
使ったことない人もこれを機にすこしずつ使ってみると良いかもしれません。

最終的にログはエクセルで見るのが一番見やすいと思います。
エクセルで扱いやすくするために以下の置換を行います。

7.置換前:「\s\[」、置換後:「\t[」
8.置換前:「\]\s」、置換後:「]\t」

これを行うとエクセルに貼り付けたときに、IPとタイムスタンプとログ内容がセルごとにわかれます。
texteditor2

6.エクセルで目的のデータを探そう

では上記のデータをエクセルに貼り付けます。
excel1-2

このままだとみにくいので、見出しつけて整形して、オートフィルタあたりつけましょう。
excel2-2

こんなかんじです。
ここまでくればIPでソートしたり、時間でソートしたりがやりやすくなるので、目的のログも探しやすくなります。
さあ、これであなたも気軽に素敵なApacheログライフ!