【发布时间】:2013-06-12 14:30:16
【问题描述】:
如何根据日志文件数据计算基于时间的指标(每小时平均值)?
让我更清楚地说明这一点,考虑一个包含以下条目的日志文件:每个 UID 在日志中只出现两次。它们将采用嵌入的 xml 格式。而且它们可能会出现乱序。而且日志文件只有一天的数据,所以只有一天的记录。
日志文件中的 UID 数量为 200 万。
我必须找出这些请求的平均每小时响应时间。下面在日志文件中有请求和响应。 UID 是关联黑白请求和响应的关键。
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><log-message-body><headers>&lt;FedDKPLoggingContext id="DKP_DumpDocumentProperties" type="context.generated.FedDKPLoggingContext"&gt;&lt;logFilter&gt;7&lt;/logFilter&gt;&lt;logSeverity&gt;255&lt;/logSeverity&gt;&lt;schemaType&gt;PCMC.MRP.DocumentMetaData&lt;/schemaType&gt;&lt;UID&gt;073104c-4e-4ce-bda-694344ee62&lt;/UID&gt;&lt;consumerSystemId&gt;JTR&lt;/consumerSystemId&gt;&lt;consumerLogin&gt;jbserviceid&lt;/consumerLogin&gt;&lt;logLocation&gt;Beginning of Service&lt;/logLocation&gt;&lt;/fedDKPLoggingContext&gt;</headers><payload>
&lt;ratedDocument&gt;
&lt;objectType&gt;OLB_BBrecords&lt;/objectType&gt;
&lt;provider&gt;JET&lt;/provider&gt;
&lt;metadata&gt;&amp;lt;BooleanQuery&amp;gt;&amp;lt;Clause occurs=&amp;quot;must&amp;quot;&amp;gt;&amp;lt;TermQuery fieldName=&amp;quot;RegistrationNumber&amp;quot;&amp;gt;44565153050735751&amp;lt;/TermQuery&amp;gt;&amp;lt;/Clause&amp;gt;&amp;lt;/BooleanQuery&amp;gt;&lt;/metadata&gt;
&lt;/ratedDocument&gt;
</payload></log-message-body></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><log-message-body><headers>&lt;fedDKPLoggingContext id="DKP_DumpDocumentProperties" type="context.generated.FedDKPLoggingContext"&gt;&lt;logFilter&gt;7&lt;/logFilter&gt;&lt;logSeverity&gt;255&lt;/logSeverity&gt;&lt;schemaType&gt;PCMC.MRP.DocumentMetaData&lt;/schemaType&gt;&lt;UID&gt;073104c-4e-4ce-bda-694344ee62&lt;/UID&gt;&lt;consumerSystemId&gt;JTR&lt;/consumerSystemId&gt;&lt;consumerLogin&gt;jbserviceid&lt;/consumerLogin&gt;&lt;logLocation&gt;Successful Completion of Service&lt;/logLocation&gt;&lt;/fedDKPLoggingContext&gt;</headers><payload>0</payload></log-message-body></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
输出应该是这样的 操作来自id,Consumer来自documentmetadata,hour是时间08:54:XX 因此,如果我们有多个请求和响应,则需要平均该时间的请求响应时间。
操作消费者 HOUR 平均响应时间(毫秒)
DKP_DumpDocumentProperties MRP 08 538
【问题讨论】:
-
使用更强大的工具,比如 Python 怎么样?使用
awk/sed/bash/... 这样做有点疯狂,恕我直言... -
我没有看到响应时间。是
989,389吗?但是你可以只使用两个长度为 24 的数组。一个做总和,一个做计数。 -
获得所需的输出以使其更清晰会有所帮助。
-
@random_thoughts 你的问题听起来真的像“我不懂 Python,请给我写一些代码”。这对 SO 来说不是一个好问题,您可能应该聘请一名程序员。
-
这是简单的文本处理,你不需要 Python,它是 awk 被发明用来做的并且做得很好的唯一一件事。它加入了所有其他的 shell 工具和结构,让你的代码变得如此混乱。