利用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脚本感兴趣的可以参考这:
还有这:
- 利用shell脚本对游戏日志信息的提取
- shell 脚本完成对日志文件的提取
- shell 脚本完成对日志文件的提取之awk 学习
- shell 脚本完成对日志文件的提取之sed 学习
- shell 脚本完成对日志文件的提取之grep 学习
- 利用Shell脚本对Nginx日志进行监控
- 利用shell脚本防止对ssh的暴力猜解
- 自定义shell脚本采集日志信息
- 利用shell脚本批量获取主机信息
- 利用shell脚本批量提取idea工作目录下的.java文件
- 日志分析的shell脚本
- 删除日志的shell脚本
- 利用shell 提取 LINUX系统监控相关信息 -1
- 利用shell 提取 LINUX系统监控相关信息 -2
- 俄罗斯方块游戏的shell脚本
- 利用curl 提取RTC WI的信息
- 提取操作系统信息脚本
- 统计下载日志流量,ip等各项信息的shell脚本代码
- C# 3.5 新特性的总结(一)
- Just one last dance最后一支舞
- Create a shortcut for a program at user Desktop
- Axure RP Pro - Wireframe线框 - 选择后面的部件
- Add Url To Favorites
- 利用shell脚本对游戏日志信息的提取
- 常用JavaScript收藏
- ClientDataSet使用方法
- something about 2009
- gcc和g++的区别
- Reset add/remove program Components
- 谈谈Unicode编码,简要解释UCS、UTF、BMP、BOM等名词
- Create a CSV file
- Java applet 写客户端 cookie