日志文件太大,python怎么分割文件,多线程 *** 作

日志文件太大,python怎么分割文件,多线程 *** 作,第1张

python的多线程为伪多线程,多线程并不能提高文件IO的速度,在读取文件时使用直接读取 for line in open('文件名', 'r')  效率最高,因为此方式为直接读取,不像其它方式要把文件全部加载到内存再读取,所以效率最高。分割时文件时,提前计算好行数,把读取的每固定数量的行数存入新文件,直接读取完成,最后删除旧文件,即可实现文件分割。

示意代码:

line_count = 0

index = 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"


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/8111610.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-13
下一篇 2023-04-13

发表评论

登录后才能评论

评论列表(0条)

保存