6

ログ ファイル データに基づいて時間ベースのメトリック (時間平均) を計算するにはどうすればよいですか?

これをより明確にするために、次のようなエントリを含むログ ファイルを考えてみましょう。各 UID は、ログに 2 回だけ表示されます。これらは、埋め込まれた xml 形式になります。そして、それらはおそらく順不同で表示されます。また、ログ ファイルには 1 日分のデータしかないため、1 日分のレコードしかありません。

ログ ファイル内の UID は 200 万個です。

これらのリクエストに対する 1 時間あたりの平均応答時間を調べなければなりません。以下は、ログファイルにリクエストとレスポンスがあります。UID は、b/w リクエストとレスポンスを関連付けるためのキーです。

2013-04-03 08:54:19,451 INFO  [Logger] <?xml version="1.0" encoding="UTF-8" standalone="yes"?><log-event><message-time>2013-04-03T08:54:19.448-04:00</message-time><caller>PCMC.common.manage.springUtil</caller><body>&lt;log-message-body&gt;&lt;headers&gt;&amp;lt;FedDKPLoggingContext id="DKP_DumpDocumentProperties" type="context.generated.FedDKPLoggingContext"&amp;gt;&amp;lt;logFilter&amp;gt;7&amp;lt;/logFilter&amp;gt;&amp;lt;logSeverity&amp;gt;255&amp;lt;/logSeverity&amp;gt;&amp;lt;schemaType&amp;gt;PCMC.MRP.DocumentMetaData&amp;lt;/schemaType&amp;gt;&amp;lt;UID&amp;gt;073104c-4e-4ce-bda-694344ee62&amp;lt;/UID&amp;gt;&amp;lt;consumerSystemId&amp;gt;JTR&amp;lt;/consumerSystemId&amp;gt;&amp;lt;consumerLogin&amp;gt;jbserviceid&amp;lt;/consumerLogin&amp;gt;&amp;lt;logLocation&amp;gt;Beginning of Service&amp;lt;/logLocation&amp;gt;&amp;lt;/fedDKPLoggingContext&amp;gt;&lt;/headers&gt;&lt;payload&gt;  
&amp;lt;ratedDocument&amp;gt;  
    &amp;lt;objectType&amp;gt;OLB_BBrecords&amp;lt;/objectType&amp;gt;  
    &amp;lt;provider&amp;gt;JET&amp;lt;/provider&amp;gt;  
    &amp;lt;metadata&amp;gt;&amp;amp;lt;BooleanQuery&amp;amp;gt;&amp;amp;lt;Clause   occurs=&amp;amp;quot;must&amp;amp;quot;&amp;amp;gt;&amp;amp;lt;TermQuery   fieldName=&amp;amp;quot;RegistrationNumber&amp;amp;quot;&amp;amp;gt;44565153050735751&amp;amp;lt;/TermQuery&amp;amp;gt;&amp;amp;lt;/Clause&amp;amp;gt;&amp;amp;lt;/BooleanQuery&amp;amp;gt;&amp;lt;/metadata&amp;gt;  
&amp;lt;/ratedDocument&amp;gt;  
&lt;/payload&gt;&lt;/log-message-body&gt;</body></log-event>

2013-04-03 08:54:19,989 INFO  [Logger] <?xml version="1.0" encoding="UTF-8" standalone="yes"?><log-event><message-time>2013-04-03T08:54:19.987-04:00</message-time><caller>PCMC.common.manage.springUtil</caller><body>&lt;log-message-body&gt;&lt;headers&gt;&amp;lt;fedDKPLoggingContext id="DKP_DumpDocumentProperties" type="context.generated.FedDKPLoggingContext"&amp;gt;&amp;lt;logFilter&amp;gt;7&amp;lt;/logFilter&amp;gt;&amp;lt;logSeverity&amp;gt;255&amp;lt;/logSeverity&amp;gt;&amp;lt;schemaType&amp;gt;PCMC.MRP.DocumentMetaData&amp;lt;/schemaType&amp;gt;&amp;lt;UID&amp;gt;073104c-4e-4ce-bda-694344ee62&amp;lt;/UID&amp;gt;&amp;lt;consumerSystemId&amp;gt;JTR&amp;lt;/consumerSystemId&amp;gt;&amp;lt;consumerLogin&amp;gt;jbserviceid&amp;lt;/consumerLogin&amp;gt;&amp;lt;logLocation&amp;gt;Successful Completion of    Service&amp;lt;/logLocation&amp;gt;&amp;lt;/fedDKPLoggingContext&amp;gt;&lt;/headers&gt;&lt;payload&gt;0&lt;/payload&gt;&lt;/log-message-body&gt;</body></log-event>

これが私が書いたbashスクリプトです。

uids=cat $i|grep "Service" |awk 'BEGIN {FS="lt;";RS ="gt;"} {print $2;}'| sort -u
for uid in ${uids}; do  
    count=`grep "$uid" test.log|wc -l`
    if [ "${count}" -ne "0" ]; then
        unique_uids[counter]="$uid"
        let counter=counter+1   
    fi   
done


echo ${unique_uids[@]}   
echo $counter  
echo " Unique No:" ${#unique_uids[@]}
echo uid StartTime EndTime" > $log

for unique_uids in ${unique_uids[@]} ; do
    responseTime=`cat $i|grep "${unique_uids}" |awk '{split($2,Arr,":|,"); print Arr[1]*3600000+Arr[2]*60000+Arr[3]*1000+Arr[4]}'|sort -n`
    echo $unique_uids $responseTime >> $log
done

出力は次のようになります。Operation は id から取得され、Consumer は documentmetadata から取得され、時間は 08:54:XX の時間です。したがって、複数の要求と応答がある場合は、その時間に受信した要求の応答時間を平均する必要があります。 .

オペレーション コンシューマー HOUR 平均応答時間 (ミリ秒)
DKP_DumpDocumentProperties MRP 08 538

4

2 に答える 2

6

投稿された入力ファイルを考えると:

$ cat file
2013-04-03 08:54:19,989 INFO [LOGGER] <?xml version="1.0" encoding="UTF-8" standalone="yes"?><event><body>&amp;lt;UId&amp;gt;904c-be-4e-bbda-3e62&amp;lt;/UId&amp;gt;&amp;lt;</body></event>
2013-04-03 08:54:39,389 INFO [LOGGER] <?xml version="1.0" encoding="UTF-8" standalone="yes"?><event><body>&amp;lt;UId&amp;gt;904c-be-4e-bbda-3e62&amp;lt;/UId&amp;gt;&amp;lt;</body></event>
2013-04-03 08:54:34,979 INFO [LOGGER] <?xml version="1.0" encoding="UTF-8" standalone="yes"?><event><body>&amp;lt;UId&amp;gt;edfc-fr-5e-bced-3443&amp;lt;/UId&amp;gt;&amp;lt;</body></event>
2013-04-03 08:55:19,569 INFO [LOGGER] <?xml version="1.0" encoding="UTF-8" standalone="yes"?><event><body>&amp;lt;UId&amp;gt;edfc-fr-5e-bced-3443&amp;lt;/UId&amp;gt;&amp;lt;</body></event>

このGNU awkスクリプト(質問に投稿したスクリプトでRSを複数文字の文字列に設定したため、GNU awkを使用しています)

$ cat tst.awk
{
    date = $1
    time = $2
    guid = gensub(/.*;gt;([^&]+).*/,"\\1","")

    print guid, date, time
}

あなたが気にかけている情報だと思うものを引き出します:

$ gawk -f tst.awk file
904c-be-4e-bbda-3e62 2013-04-03 08:54:19,989
904c-be-4e-bbda-3e62 2013-04-03 08:54:39,389
edfc-fr-5e-bced-3443 2013-04-03 08:54:34,979
edfc-fr-5e-bced-3443 2013-04-03 08:55:19,569

あとは簡単な計算ですよね?そして、この awk スクリプトで実行します。awk の出力を間抜けなシェル ループにパイプしないでください。

于 2013-06-12T15:05:07.397 に答える
3

Ed Morton のソリューションの拡張:

script.awk の内容

function parse_time (date, time,        newtime) {
    gsub(/-/, " ", date)
    gsub(/:/, " ", time)
    gsub(/,.*/, "", time)
    newtime = date" "time
    return newtime
}

(gensub(/.*;gt;([^&]+).*/,"\\1","") in starttime) {
    etime = parse_time($1, $2)
    endtime[gensub(/.*;gt;([^&]+).*/,"\\1","")] = etime
    next
}
{
    stime = parse_time($1, $2)
    starttime[gensub(/.*;gt;([^&]+).*/,"\\1","")] = stime
}

END {
    for (x in starttime) {
        for (y in endtime) {
            if (x==y) {
                diff = mktime(endtime[x]) - mktime(starttime[y])
                diff = sprintf("%dh:%dm:%ds",diff/(60*60),diff%(60*60)/60,diff%60)
                print x, diff
                delete starttime[x]
                delete endtime[y]
             }
        }
    }
}

テスト: テスト用に GUID の順序を変更しました

$ cat log.file 
2013-04-03 08:54:19,989 INFO [LOGGER] <?xml version="1.0" encoding="UTF-8" standalone="yes"?><event><body>&amp;lt;UId&amp;gt;904c-be-4e-bbda-3e62&amp;lt;/UId&amp;gt;&amp;lt;</body></event>
2013-04-03 08:54:34,979 INFO [LOGGER] <?xml version="1.0" encoding="UTF-8" standalone="yes"?><event><body>&amp;lt;UId&amp;gt;edfc-fr-5e-bced-3443&amp;lt;/UId&amp;gt;&amp;lt;</body></event>
2013-04-03 08:54:39,389 INFO [LOGGER] <?xml version="1.0" encoding="UTF-8" standalone="yes"?><event><body>&amp;lt;UId&amp;gt;904c-be-4e-bbda-3e62&amp;lt;/UId&amp;gt;&amp;lt;</body></event>
2013-04-03 08:55:19,569 INFO [LOGGER] <?xml version="1.0" encoding="UTF-8" standalone="yes"?><event><body>&amp;lt;UId&amp;gt;edfc-fr-5e-bced-3443&amp;lt;/UId&amp;gt;&amp;lt;</body></event>
$ awk -f script.awk log.file 
904c-be-4e-bbda-3e62 0h:0m:20s
edfc-fr-5e-bced-3443 0h:0m:45s
于 2013-06-12T16:11:13.793 に答える