利用shell脚本对游戏日志信息的提取
2009-01-10 15:03
417 查看
一个优秀的日志系统对于游戏的开发和运营是非常重要的,日志可以又来分析程序的运行,查找bug,监控游戏的运行状态,获得玩家的活动细节等等.
日志保存为文本文件,我们在查找所需要的信息的时候,一般会用到grep ,egrep等等的命令,比如: grep 大鹏 /log/scene*,就可以检索出大鹏作为关键字的相对应的信息。关于grep等命令的使用,
这http://www.kuqin.com/aixcmds/aixcmds2/grep.htm#kxf1170fish
有详细的介绍,但是,简单的采用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几个命令,可以从这参考:
http://www.kuqin.com/aixcmds/
对shell脚本感兴趣的可以参考这:
http://xiaowang.net/bgb-cn/index.html
还有这:
http://www.tsnc.edu.cn/default/tsnc_wgrj/doc/abs-3.9.1_cn/html/index.html
日志保存为文本文件,我们在查找所需要的信息的时候,一般会用到grep ,egrep等等的命令,比如: grep 大鹏 /log/scene*,就可以检索出大鹏作为关键字的相对应的信息。关于grep等命令的使用,
这http://www.kuqin.com/aixcmds/aixcmds2/grep.htm#kxf1170fish
有详细的介绍,但是,简单的采用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几个命令,可以从这参考:
http://www.kuqin.com/aixcmds/
对shell脚本感兴趣的可以参考这:
http://xiaowang.net/bgb-cn/index.html
还有这:
http://www.tsnc.edu.cn/default/tsnc_wgrj/doc/abs-3.9.1_cn/html/index.html
相关文章推荐
- shell脚本自动清理服务器日志、图片等信息
- 自定义shell脚本采集日志信息
- shell 脚本完成对日志文件的提取之awk 学习
- 【shell脚本练习】网卡信息和简单日志分析
- 【shell脚本练习】网卡信息和简单日志分析
- 创建shell脚本,利用for循环箱向日志文件中插入n条数据
- 利用shell脚本“综合、集中”查看linux server常用软硬件信息 推荐
- 利用shell脚本“综合、集中”查看linux server常用软硬件信息
- shell 脚本完成对日志文件的提取之sed 学习
- shell 脚本完成对日志文件的提取之grep 学习
- 统计下载日志流量,ip等各项信息的shell脚本代码
- linux利用shell脚本和cron实现定时备份、上传及垃圾日志清理(原创)
- 利用shell 提取 LINUX系统监控相关信息 -1
- 利用shell脚本批量提取idea工作目录下的.java文件
- QT-窗口打印debug信息,本地日志保存,以及执行shell脚本并且把信息打印在窗口
- CentOS7 下一个利用安全日志和防火墙防止暴力破解的SHELL脚本
- 利用TortoiseSVN钩子脚本,自动填写/导入日志信息
- 利用Shell脚本对Nginx日志进行监控
- shell 脚本完成对日志文件的提取
- 利用shell 提取 LINUX系统监控相关信息 -2