现在的位置: 首页 > 综合 > 正文

使用AutoHotkey分析日志文件,得到分析报告。

2013年01月07日 ⁄ 综合 ⁄ 共 1879字 ⁄ 字号 评论关闭




使用
AutoHotkey
分析日志文件,得到分析报告。

 

由程序自动生成的日志文件一般有固定的格式,而且文件大小通常比较大。当需要分析这样的日志文件,需要用肉眼在成千上万条记录里面寻找异常,那将是大海捞针,十分费力费时。由于这样的日志文件具有固定格式,我们可以过滤掉不关心的记录,留下有用的记录。我们可以通过程序来实现这种过滤,但是代价十分高,因为每种日志文件的格式并不一样,不可能每遇到一种日志就写一个程序吧!这时,
AutoHotkey
就可以大显身手了,利用它的文件读写功能,简单快捷,无需编译,随时可以修改,随时可以运行。下面展示一下,用
AutoHotkey
分析日志的方法:

 

需求:

一个
PDF

TXT
的程序,会产生一个结果日志,记录了每个
PDF
文件转换的结果。记录格式如下:


这个程序运行了一天一夜之后,该日志文件达到
1M
大小,记录达到
10000
多行。当我想查看有多少记录因某几种原因而转换失败时,发现大部分记录都是转换成功,失败的也大部分是因为某一个我并不关心的原因。而这些记录,严重干扰了我寻找重要的记录,因此我想把不关心的记录过滤掉,比如将所有转换成功的记录行去掉,但提取其文件的
ID
,最后将所有转换成功的文件
ID
归类到一些,写到文件最尾部。而关心的内容则不过滤掉,显示在文件的前面,如下图所示:

这张图里把不关心的记录归类在一起了,其他的记录则原样保留以便分析。下面开始介绍
AutoHotkey
的实现脚本程序,看看需要多少文字!

 

AutoHotkey
实现脚本:

一、首先,写两个处理字符串的函数,方便提取
PDF
正文
ID

StrLeft2Sub( )
在给定的字符串中寻找某个子串,将其左边的文字截取返回。如:

String = cwin@live.cn

StrLeft2Sub( String, “@”)
返回的值为
cwin

类似地

StrRight2Sub( String, “@” )

返回值为
live.cn

 

二、接下来,写一个打开文件的对话框,让用户选择需要转换的文件,保存到变量
var_SelectedFile

 

这条语句的效果如下:

 

三、选择好需要生成报告的日志文件之后,得到生成的报告的文件名。

如:
temp.log
生成的报告名为
temp_rpt.log


 

 

四、下面读取所选择的日志文件(假设为
temp.log
),并且将分析的结果写到
(
假设为

temp_rpt.log )

 

读取文本文件有三种方法:

1、 



FileRead, OutputVar, Filename

直接将整个文件读取到内存中,当日志文件较大时,这样很浪费内存。

2、 



FileReadLine, OutputVar,
Filename, LineNum

一次读取一行文本,需要指定行数。该命令打开文件,读取一行文本,之后就关闭文件了。当要遍历一个行数很多的文本文件时,这种方法不适合。

3、 



Loop, Read, InputFile [,
OutputFile]

同时打开输入和输出文件,然后循环遍历输入文件,直到处理完毕,关闭文件。在遍历过程中,文件保持打开,文件处理效率较高。我们选择这种方式处理日志文件。

 

这段代码遍历所选择的文件,每次读取一行文本到
A_LoopReadLine
。第一行中的
%var_SelectedFile%
即是变量所选择的文件路径,
%var_outfile%
则是输出文件的路径。
Var_SelectedFile

var_outfile
是保存文件路径的变量,在其前后加
%
号,表示取变量的值。

 

var_sub := StrRight2Sub( A_LoopReadLine,
"] :" )

将读取出来的一行字符串,截取时间后面的字符串保存到变量
var_sub
中,为提取正文
ID
作准备。

 

下面是完整的分析日志的代码:

说明一下:

1
、“
ifinstring var_sub,
转换成功
”的含义是:如果字符串
var_sub
中包含了文字“转换成功”

2

var_sucess = %var_sucess%%var_id%
将正文
ID
的值增加到
var_sucess

变量中

3

 
FileAppend, %A_LoopReadLine%`n


Loop
循环中的
FileAppend
命令,将没有被过滤掉的行原样输出到
var_outfle
文件中。

4

if var_sucess <>
表示
if ( var_sucess != “” )

5

Loop
循环外的
FileAppend

命令,将归类好的成功转换的正文
ID
字符串
var_sucess
附加到指定文件的末尾。注意,在这里要指明附加的目标文件为
%var_outfile%

 

 

好了,脚本写完了,可以直接运行了!怎么样,是不是很简捷呀!

 

抱歉!评论已关闭.