一. 实现功能
- 环境:winodow10家庭版 python3.7.1
- IDE:sublime_text3
- 需求:为了满足日常运维需要,快速的分析定位tomcat故障原因。
- 使用:将tomcat日志放到桌面后,在脚本尾部填入运行路径,然后运行脚本,会在桌面生成一个txt文档,记录的是Tomcat运行时间超过0.5S的日志。
- 注:观察tomcat日志会发现,关于运行时间的语句无规律呈现,所以只能挑选出其中的开头和结尾的标志语句,具体错误内容无法截取出,查看时,可复制截取出的标志语句放入总日志中进行搜索,即可看到错误内容。
二. 思路
- 导入模块
- 建立自建函数
- 逐行读取日志文件,遍历,先读取带有运行时间的行。
- 将读取的信息导入f1
- f1再进行区分大于0.5s的日志
- 再将第二次过滤的日志导入f2
- f2就是需要的最终日志
三. 代码
import re
import os
def time_log(logname):
f1=open(logname,enconding='utf-8')
my1=[]
for a in f1:
b=re.search('open in',a,re.IGNORECASE)
c=re.search('closed after',a,re.IGNORECASE)
if b or c:
log_str=a
my.append(log_str)
path='C://Users//user//Desktop'
time1_path=os.path.join(path,'tt.log')
f2=open(time1_path,'w')
f2=writeline(my1)
f1.close()
f2.close()
f2=open(time1_path,'r')
my2=[]
for d in f2:
e=f2.spilt(' ')
num=int(e[-2])
if num>500:
my2.append(num)
time2_path=os.path.join(path,'time')
f3=open(time2_path,'w')
f3.writeline(my2)
f3.fluse()
f3.close()
f2.close()
return 0
time_log(C://Users//user//Desktop)
四. 代码详解
def 函数名称 (函数内变量)
def自建函数open(文件名称,打开方式)
(1)read
读
r
以只读方式打开,默认。
rb
以二进制格式只读方式打开,默认。
r+
打开一个文件用于读写,文件指针会放在开头。
rb+
以二进制方式打开一个文件用于读写
(2)write
写
w
以写入方式打开,如果原文件存在则打开文件,从头开始编辑,即原有内容会被覆盖,如果原文件不存在,则创建新文件。
wb
以二进制格式写入方式打开,如果原文件存在则打开文件,从头开始编辑,即原有内容会被覆盖,如果原文件不存在,则创建新文件。
w+
打开一个文件用于读写,如果原文件存在则打开文件,从头开始编辑,即原有内容会被覆盖,如果原文件不存在,则创建新文件。
wb+
以二进制方式打开一个文件用于读写,如果原文件存在则打开文件,从头开始编辑,即原有内容会被覆盖,如果原文件不存在,则创建新文件。
(3)append
追加
a
打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
ab
以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
a+
打开一个文件用于读写追加。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
ab+
以二进制格式打开一个文件用于读写追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。- Python中的for循环有遍历作用,可以将f1中所以数据遍历,Python脚本中在文件中搜寻相关字符等都会用到for的遍历功能。
b=re.search('open in',a,re.IGNORECASE)
在文件的每一行中寻找,带有 ‘open in’ 字符的行,如果寻找到,那就返回行,re.IGNORECASE
表示不区分大小写。append()
此时的log_str等于a,等于所有符合该字符的行数,把他添加到my.这个列表中。os.path.join()
用于文件拼接路径,会将其中的path1和path2拼接起来,形成新的路径。- open()和close() 相呼应,打开后必须得关闭,否则脚本会出错,而其中的打开方式可以参考第二条Write和Read的意义。
write()
和writelines
区别:write()
需要传入一个字符串做为参数,否则会报错,而writelines()
既可以传入字符串又可以传入一个字符序列,并将该字符序列写入文件
注意 :writelines
必须传入的是字符序列,不能是数字序列
如:list_1023 = [1,2,3,4,5]spilt(' ')
通过指定分隔符对字符串进行切片。
spilt(‘str’,num) str指分隔符,num指分成几块,默认值是-1(全部分割) ,例:my.spilt(’ ',1),指以空格为分割符,1是分割一次,也就分割成两个。num=int(e[-2])
int()是转化为字符,防止报错。e[-2],就是把分割成的命名为e然后取倒数第二个字符。return
是返回。程序遇到return即返回,退出def模块,也不会再运行第二个return。