利用shell脚本对游戏日志信息的提取

来源:互联网 发布:图片条形码识别软件 编辑:程序博客网 时间:2024/06/04 19:58
一个优秀的日志系统对于游戏的开发和运营是非常重要的,日志可以又来分析程序的运行,查找bug,监控游戏的运行状态,获得玩家的活动细节等等.
  日志保存为文本文件,我们在查找所需要的信息的时候,一般会用到grep ,egrep等等的命令,比如: grep 大鹏 /log/scene*,就可以检索出大鹏作为关键字的相对应的信息。关于grep等命令的使用,
有详细的介绍,但是,简单的采用grep命令可能不能满足我们的需求,我在工作的过程中就遇到了这样的问题,我们的服务器方面有点内存泄露,之前的经验是通过分析内存管理器的相应日志查找,内存相应的日志信息大概是这样的:
081205-01:53:00 GS[2205] DEBUG: 分配器:256,占用大小:6024,占用个数:1,使用个数:1 ,释放个数:0,占比:100.00%
.
.
.
081205-01:53:00 GS[2205] DEBUG: 分配器个数:30,占用:297123456
上面的信息显示了01:53:00时刻内存管理器每个分配器占用的大小和总占用的大小的信息。
 现在我有这样的需求: 希望可以服务器启动到现在每个分配器增加的大小,和总占用增加的大小,然后增加的大小从大到小进行排序,如果某个分配器增加的大小出现异常,就表示调用这个分配器的地方出现了没有释放内存的问题。

 在开始之前有一个问题需要解决,那就是服务器可能是中途重新启动了,也就是内存分配器的大小是从新计算的,比如启动的时候会打出这样的日志:
 081205-01:53:00 GS[2205] DEBUG: Program start as demeon
 我们要做的就是去掉这条日志之前的相应信息,可以通过使用 sed 命令达到目的.
 sed '1,/Program/d' ./text > ./text2
 这样我们就可以把text中第一次出现Program关键字之前的行全部删除,输出到text2中
 
 这样我们需要编写一个脚本,方面的提取我们需要的信息。
 首先我们统计内存管理器总增加的大小,可以通过一下的步骤:
 1:   grep -E '分配器个数|Program' /log/scene* > ./tempAllSize.txt ,将所有有分配器个数或者Program关键词的日志输出到tempAllsize.txt中
 2:   sed '1,/Program/d' ./tempAllSize.txt > ./tempAllSize2.txt ,去掉服务器启动之前的数据
 3:   MinAllSize=$(sort -u -t: +6n  ./tempAllSize2.txt | head -n 1 |  awk -F : ' {print $7}')
      MaxAllSize=$(sort -u -t: +6nr ./tempAllSize2.txt | head -n 1 | awk -F : '{print $7}')
      分配器总大小最小的值保存为MinAllSize变量中,最大值MaxAllSize中。然后两个值相减就可以得出总增加的大小

  其次我们需要输出每个分配器增加的大小,我们可以这样
 1:    grep -E '分配器[^分配器个数]|Program /log/scene*' > tempAllText.txt ,所有关键词为分配器,但是不是分配器个数的日志输出到tempAllText.txt
 2:    sed '1,/Program/d' ./tempAllText.txt > tempAfterSort.txt ,出去启动前的数据
 3:  
while read line
do
i=$(echo $line |awk -F : '{print $6}' | awk -F , '{print $1}')
if [ $i -eq $Block ]
then
i=$(echo $line |awk -F : '{print $7}' | awk -F , '{print $1}')
if [ $i -gt $OneBlockMaxSize ]
then
let "OneBlockMaxSize=$i"
elif [ $i -lt $OneBlockMinSize ]
then
let "OneBlockMinSize=$i"
fi
else
let "OneBlockAddSize=$OneBlockMaxSize-$OneBlockMinSize"
echo 分配器$Block-min size=$OneBlockMinSize-max size=$OneBlockMaxSize-add                                       size=$OneBlockAddSize>>MemoryStat.txt
let "Block=$i"
let "OneBlockMaxSize=$(echo $line | awk -F : '{print $7}' | awk -F , '{print $1}')"
let "OneBlockMinSize=$OneBlockMaxSize"
echo 现在处理分配器$Block
fi
done < ./tempAfterSort.txt
 上面一段小脚本将每个分配器的增加的大小输出到MemoryStat.txt中
4: sort -t= +3nr ./MemoryStat.txt ,按每个分配器增加的大小进行从大到小的排序
最后记得删除临时文件。

 上面的小脚本中,主要用到了awk,sort,sed几个命令,可以从这参考:
对shell脚本感兴趣的可以参考这:
还有这:
原创粉丝点击