python的多线程为伪多线程,多线程并不能提高文件IO的速度,在读取文件时使用直接读取 for line in open('文件名', 'r') 效率最高,因为此方式为直接读取,不像其它方式要把文件全部加载到内存再读取,所以效率最高。分割时文件时,提前计算好行数,把读取的每固定数量的行数存入新文件,直接读取完成,最后删除旧文件,即可实现文件分割。
示意代码:
line_count = 0index = 0
fw = open('part'+str(index)+'.log', 'w')
for line in open('filename.log', 'r'):
fw.write(line)
line_count += 1
# 假设每10000行写一个文件
if line_count > 10000:
fw.close()
index += 1
fw = open('part'+str(index)+'.log', 'w')
fw.close()
本文使用Python2.7解析nginx日志文件,并把nginx的时间转化为时间戳(1970纪元后经过的浮点秒数),并存放到特定文件中。
Nginx的http日志格式:
示例如下:
这里使用Python的glob模块来获取所有日志文件。日志文件每天0时进行备份,命名为nginx.log.YYMMDD。
模块linecache允许从任何文件里得到任何的行,并且使用缓存进行优化,常见的情况是从单个文件读取多行。
使用python的re模块解析每一条日志。
其中body_bytes捕获非空字符串,而不是数字,因为日志里可能存在该字段值为“-”,即没有请求体。
date、method、request等参数可以采用以下方式进行提取。
使用python的time模块把时间转为时间戳。
产生文件time.log,内容如下:
利用sys.stdout将print行导向到你定义的日志文件中,例如:import sys
# make a copy of original stdout route
stdout_backup = sys.stdout
# define the log file that receives your log info
log_file = open("message.log", "w")
# redirect print output to log file
sys.stdout = log_file
print "Now all print info will be written to message.log"
# any command line that you will execute
log_file.close()
# restore the output to initial pattern
sys.stdout = stdout_backup
print "Now this will be presented on screen"
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)