kSarを使って、apacheのcombinedログをグラフ化する方法
「お前は何をいっているんだ?」 と突っ込まれそうなタイトルですが、アクセスログを簡単にグラフ化できたら便利そうなので真面目に考えてみます。
Contents
kSarを使って、apacheのcombinedログをグラフ化する意味は?
ずばり、インフラエンジニアがコンテンツやシステムのアクセス数の推移を把握できることです。
アクセス数の推移が把握できると、サーバ負荷の原因がアクセス急増にあったのかどうかの判断や、コンテンツの傾向を把握することでよりよい運用ができることになります。
アクセス数の推移をみるために、2014年現在で一番メジャーな方法はGoogleAnalyticsだと思います。じゃぁ、「GoogleAnalytics見ればいいじゃん」と一蹴されてしまいそうですが、世の中GoogleAnalyticsを見ることができない人たちがいます。俗に言うインフラエンジニアと呼ばれる人たちです。
DevOpsという言葉が叫ばれ、エンドユーザ、開発(制作)、運用の全員が同じものを見て会話することが重要といわれていますが、未だ別々のものを見て会話している現場が多いのではないでしょうか。GoogleAnalyticsはエンドユーザ、開発(制作)は見ているものですが、運用の現場ではあまり見られていません。
開発から運用まで全て自社で行っている場合は共有されているかもしれませんが、開発と運用が分離している場合などはほぼ間違いなく共有されていません。
私はホスティング事業者に勤めていますが、よほど濃い対応をするお客さんいがいでは、GoogleAnalyticsの情報をもらったりはしません。
インフラエンジニアがコンテンツの状況を把握するための手段は、CPU、メモリやトラフィックなどの状況やアクセスログに限られるのです。
kSarがグラフを生成する仕組み
kSarはどのようにしてグラフを作成しているのでしょうか?
kSarの入力情報
kSarはグラフ化するさいに次のようなコマンドでグラフを作成することができました。
java -jar kSar.jar -input 'cmd://sar -f /var/log/sa/sa02 -w -outputPDF 'sa02.pdf'
なんとなくsarの出力結果に秘密がありそうです。sarでコンテキストスイッチの出力結果をみてみましょう。
LANG=C ;sar -w|head -n 10 Linux 2.6.32-431.5.1.el6.x86_64 (dti-vps-srv712) 11/08/14 _x86_64_ (1 CPU) 00:00:01 proc/s cswch/s 00:01:01 17.41 87.90 00:02:01 1.28 52.92 00:03:01 1.04 50.85 00:04:01 1.05 50.62 00:05:01 1.00 50.57 00:06:01 1.04 51.21 00:07:01 1.10 51.49
先頭ヘッダ行
先頭行はヘッダになっており、スペース区切りで次のような項目順で並んでいそうです。
- プラットフォーム
- カーネルバージョン
- ホスト名
- 該当日
- ビット数
- CPU数
データヘッダ行
データ部のヘッダは次の通りです。
- 時刻(hh:mm:ss形式)
- データの名前
データ行
実データ部は
- 時刻(hh:mm:ss形式)
- データ
となります。
入力情報を偽装できないか?
上記のフォーマットを入力情報としていると考えると、このデータ部分を偽装することでグラフ化ができそうな気がします。
次のようなファイルを作成します。
Linux 2.6.32-431.5.1.el6.x86_64 (access_log) 11/08/14 _x86_64_ (1 CPU) 00:00:01 proc/s cswch/s 00:01:01 0 10 00:02:01 0 20 00:03:01 0 100 00:04:01 0 1000 00:05:01 0 300 00:06:01 0 100 00:07:01 0 80
そして次のコマンドでグラフ化してみます。
java -jar kSar.jar -input 'file://access' -outputPNG access_gisou -addHTML
結果はこちらのグラフの通りです。見事にグラフができました。
どうやら、データのヘッダ部の項目を見て、出力グラフの種類を判断しているようです。この仕様を利用することで、データ部にアクセスログの集計を置き換えてあげることで、ラベルは変更できませんでしたが、グラフ化はできそうです。
kSarを使って、アクセス数の推移をグラフ化する方法
アクセスログをグラフ化するために、次のようなシェルを書いてみます。PVっぽいアクセスをPDFにグラフ出力しています。
ログファイルやkSarの位置などは適宜書き換えてください。また、アクセスログは時間しかみていないので、1日1回24時にローテートされている前提です。複数日付のログが混じっている場合は、時間でマージされて1日分のグラフとして表示されてしまいます。
vi httpd_access_graph.sh #/bin/sh LOG="/var/log/httpd/access_log" OUTFILE="log.txt" OUTFILE_TMP="log.txt.tmp" OUTPDF="http_access.pdf" KSAR_JAR="/usr/local/kSar/kSar.jar" cat ${LOG}|egrep -v "\.css|\.js|\.class|\.gif|\.jpg|\.jpeg|\.png|\.bmp|\.ico|\.swf|/js/|\.cur|healthcheck.txt|\.xml"|awk '{print $4 ":00"}' |cut -f2,3,5 -d:|sort|uniq -c|awk '{print $2 " " $1 " 0"}'>${OUTFILE_TMP} echo "Linux 3.10.34-39.137.amzn1.x86_64 (access_log) 11/06/14 _x86_64_ (2 CPU)">${OUTFILE} head -n 1 ${OUTFILE_TMP} |awk '{print $1 " cswch/s proc/s"}'>>${OUTFILE} cat ${OUTFILE_TMP}>>${OUTFILE} java -jar ${KSAR_JAR} -input 'file://'${OUTFILE} -outputPDF ${OUTPDF}
ざっくりとした実施内容は次の通りです。
combinedログから、PVっぽいアクセスの抽出し時間別に集計
cat ${LOG}|egrep -v "\.css|\.js|\.class|\.gif|\.jpg|\.jpeg|\.png|\.bmp|\.ico|\.swf|/js/|\.cur|healthcheck.txt|\.xml"|awk '{print $4 ":00"}' |cut -f2,3,5 -d:|sort|uniq -c|awk '{print $2 " " $1 " 0"}'>${OUTFILE_TMP}
- ${LOG}のログファイルから、egrepを使いcss,js,jpgなどの、PVとは関係なさそうな要素を除外しています
- 除外したログから、awkとcutで、「hh:mm:00」の書式で、分単位のデータのみに加工します
- sortとuniqで、集計を行います
- 最後にawkを使って、データ部と同様のフォーマットにするために、列を入れ替えています
ヘッダ行を出力
echo "Linux 3.10.34-39.137.amzn1.x86_64 (access_log) 11/06/14 _x86_64_ (2 CPU)">${OUTFILE}
ヘッダ行を出力します。ホスト名の部分だけaccess_logと変更しています。スペースを含む言葉を使うとエラーになるので気をつけましょう。
データのヘッダ行を出力
head -n 1 ${OUTFILE_TMP} |awk '{print $1 " cswch/s proc/s"}'>>${OUTFILE}
時刻+データの名前のフォーマットになるので、集計したデータの先頭時刻をピックアップしています。
データの行を出力
cat ${OUTFILE_TMP}>>${OUTFILE}
最後にデータ行を連結されて入力フォーマットの完成です。
グラフの作成
java -jar ${KSAR_JAR} -input 'file://'${OUTFILE} -outputPDF ${OUTPDF}
ファイルの読み込みを行いグラフの作成を行います。
うまく作成できない場合は、入力ファイルを確認してみたり、グラフ作成の部分をコマンド実行するなどしてデバッグしてみましょう。
特記事項
数GB以上の大容量ファイルを対象にして、高負荷環境では実施しないほうがいいかもしれません。
出力形式をhtmlにすることもできるので、ウェブ経由で簡単にアクセスログをグラフ出力するツールなんかも作れると思います。
最後に
目盛り軸のラベルが適切ではない、などの問題があるので、他者へ提出するには微妙かもしれませんが、パッとアクセス状況を俯瞰し、情報を把握するには十分だと思います。
せっかくの保存しているログなので、有効活用できるといいですね。
この記事へのコメントはこちら