24時間365日フルマネージドホスティングサービスのデイーネット

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

こんにちは、「負荷テスト中の●●」シリーズでお馴染みの浅見です。

前回「負荷テスト中のアクセスログを解析する」という記事を書きました。

今回は、ちょっと応用して、下の図のように複数サーバのアクセスログを一気に解析する方法をご紹介します。

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

テンポラリディレクトリです。

ログ解析中の一時ファイルが保存されます。

accesslog1 accesslog2

解析するためのアクセスログです。

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等で加工することで欲しい情報を入手できると思います。

  • このページの先頭へ

  • 東京本社
    〒105-0001東京都港区虎ノ門2-3-22 第一秋山ビル5F
    TEL:03-3591-8887 FAX:03-3591-8886
  • 大阪本社
    〒541-0041 大阪市中央区北浜2-6-11北浜エクセルビル5F
    TEL:06-6231-8887 FAX:06-6231-8897

  • 認証範囲はこちらをご覧ください。

Denet logo

クラウドサービス・データセンタ・高機能専有サーバ・共有サーバホスティングサービス 株式会社ディーネット
dot_bar