負荷テスト中のアクセスログを解析する~複数ログファイル編~

こんにちは、「負荷テスト中の●●」シリーズでお馴染みの浅見です。
前回「負荷テスト中のアクセスログを解析する」という記事を書きました。
今回は、ちょっと応用して、下の図のように複数サーバのアクセスログを一気に解析する方法をご紹介します。
access_log_analyze.jpg

サンプル構成

今回紹介するシェルは、次のような構成で動作します。

# ls -rlth
合計 2.5M
-rw-r--r-- 1 root root   24  2月 19 17:02 2018 list.txt
drwxr-xr-x 2 root root 4.0K  2月 19 17:05 2018 tmplogs
-rwxr-xr-x 1 root root 3.1K  2月 19 17:21 2018 analyze.sh
-rw-r--r-- 1 root root 1.2M  2月 19 17:39 2018 access_log1
-rw-r--r-- 1 root root 1.3M  2月 19 17:39 2018 access_log2

analyze.sh

ログ解析用シェルです。
引数なしで実行が可能です。

list.txt

ログ解析用シェルの入力ファイルです。
ファイルに、解析対象のアクセスログ名を記載します

# cat list.txt
access_log1
access_log2

tmplogs

テンポラリディレクトリです。
ログ解析中の一時ファイルが保存されます。

access_log1 access_log2

解析するためのアクセスログです。
list.txt内にファイル名を記載する必要があります。

アクセスログを解析するシェル

シェル内容

#!/bin/sh
#-------------------------------------------------------
# アクセスログ解析スクリプト
# アクセスログから時系列に平均応答速度と件数を取得します
#  list.txtに解析対象ログファイル名を記載してください
#-------------------------------------------------------
# アクセスログ数分繰り返し
while read access_log
do
# 一時ファイルの変数定義
log_access=tmplogs/${access_log}
tmp_pv_file=${log_access}.pv
tmp_timelist=${log_access}.time
tmp_nmbr_ave_file=${log_access}.nmbr_ave
tmp_time_ave_file=${log_access}.time_ave
tmp_nmbr_ave_join_file=${log_access}.avecnt.join
tmp_time_ave_join_file=${log_access}.avetime.join
#-------------------------------------------------------
# PVっぽいアクセスのみピックアップする
#-------------------------------------------------------
cat $access_log|egrep -v ".svg|.css|.js|.class|.gif|.jpg|.jpeg|.png|.bmp|.ico|.swf|/js/|.cur|healthcheck.txt|.xml">${tmp_pv_file}
#-------------------------------------------------------
# 時系列の応答時間ファイルの作成
#-------------------------------------------------------
# hh:mm:ss の形式で時間を抽出
cat ${tmp_pv_file} |awk '{print $4}'|awk -F: '{print $2 ":" $3 ":" $4}'|sort|uniq|sort -n>${tmp_timelist}
# 平均応答速度と件数を取得
echo > ${tmp_nmbr_ave_file}
echo > ${tmp_time_ave_file}
echo 00:00:00 ${access_log}(秒)>${tmp_time_ave_file}
echo 00:00:00 ${access_log}(件)>${tmp_nmbr_ave_file}
while read time
do
# 平均応答時間
responsetime=grep ${time} ${tmp_pv_file}|awk '{m+=$NF} END{print m/NR/1000000;}'
echo ${time} ${responsetime} >> ${tmp_time_ave_file}
# 平均PV件数
count=grep ${time} ${tmp_pv_file}|awk 'END{print NR;}'
echo ${time} ${count} >> ${tmp_nmbr_ave_file}
done <${tmp_timelist}
#-------------------------------------------------------
# ファイルを結合
#-------------------------------------------------------
if [ "${tmp_nmbr_ave_join}" = "" ] ; then
# 最初のファイルの場合
cat ${tmp_nmbr_ave_file}>${tmp_nmbr_ave_join_file}
cat ${tmp_time_ave_file}>${tmp_time_ave_join_file}
else
# 2番目以降のファイルの場合
join ${tmp_nmbr_ave_join} ${tmp_nmbr_ave_file}>${tmp_nmbr_ave_join_file}
join ${tmp_time_ave_join} ${tmp_time_ave_file}>${tmp_time_ave_join_file}
fi
tmp_nmbr_ave_join=${tmp_nmbr_ave_join_file}
tmp_time_ave_join=${tmp_time_ave_join_file}
done < list.txt
#-------------------------------------------------------
# 区切り文字をスペースからタブへ変更
#-------------------------------------------------------
join ${tmp_nmbr_ave_join} ${tmp_time_ave_join}|sed 's/ /t/g'>result.txt
echo
echo "結果は「result.txt」を確認ください"
echo
echo "先頭10行をピックアップしています↓"
head -n 10 result.txt

ポイントは、joinコマンドです。
joinコマンドは、SQLの内部結合(INNER JOIN)のような振る舞いができるので、アクセスログの時間をキーにして、合致する列を結合させることができます。
注意点としては、どちらか片方にしかない場合は無視されてしまうところです。アクセス状況に応じて、キーになる時間軸を「時分秒」とするか「時分」とするなど調整すると良いでしょう。

実行結果

上記シェルを実行すると、次のような結果が得られます。 ※CentOS6.9で動作確認しています

# ./analyze.sh
結果は「result.txt」を確認ください
先頭10行をピックアップしています↓
00:00:00        access_log1(件) access_log2(件) access_log1(秒) access_log2(秒)
13:00:14        1       5       1.47043 0.184377
13:00:15        1       17      0.058535        0.0644814
13:00:16        8       15      0.0669267       0.104769
13:00:17        7       35      0.0575099       0.0366286
13:00:18        5       23      0.0757728       0.0391552
13:00:19        2       28      0.0178125       0.0444122
13:00:20        13      37      0.0475866       0.157888
13:00:21        13      41      0.0749071       0.0499775
13:00:22        19      28      0.169945        0.130676

結果はタブ区切りのテキストファイルで出力されます。
次のような順番で結果が出力されます。

  • 時分秒
  • アクセスログ1の件数
  • アクセスログ2の件数
  • アクセスログ1の平均応答速度
  • アクセスログ2の平均応答速度
    クライアントPCへダウンロードし、Excel等で加工することで欲しい情報を入手できると思います。

返信を残す

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

CAPTCHA