Python实现大日志文件分割与基于时间戳重命名脚本
本文介绍两个Python脚本,用于处理测试或压测产生的大体积日志文件。第一个脚本将大文件按指定行数分割为多个小文件;第二个脚本读取分割后的文件,提取首尾日志的时间戳,并以此重命名文件。通过自动化处理,提升日志定位效率,适用于Windows和Linux环境。
日志文件分割与命名处理概述
日志文件分割与命名处理
在日常工作中,经常需要接收来自测试人员或客户提供的日志文件,这些文件大小可能达到几百MB甚至GB级别。由于长时间压测产生的日志量巨大,对日志进行分割处理成为必要步骤。为了便于快速定位问题,通常建议根据日志的时间点来命名分割后的文件,这样能直观地反映文件内容的时间范围。以下分享两个Python脚本,分别用于文件分割和基于时间戳的命名,希望能提供实用参考。
大文件分割脚本实现
大文件分割脚本
使用方法如下:
- python split_big_file.py
- 输入目标大文件的完整路径
- 指定分割后每个小文件包含的行数
- 等待脚本执行完毕。
# -*- coding:utf-8 -*-
import os,re,shutil
import platform
sys_name = platform.system().lower()
SPLIT_CHAR = '\\' if sys_name.find('windows') != -1 else '/'
print('input big files`s path:')
_path = raw_input()
names = []
pathes = []
if os.path.isfile(_path):
print('is file')
names.append(_path)
else:
print('is nothing')
'''
elif os.path.isdir(_path):
print('This is dir')
pathes = os.listdir(_path)
print('pathes='+str(pathes))
for i in range(len(pathes)):
fullpath = _path+SPLIT_CHAR+pathes[i]
print('fullpath='+fullpath)
if os.path.isfile(fullpath):
names.append(fullpath)
files.append(open(fullpath).read().split('\n'))
'''
print(len(names))
line_num = int(raw_input('every file`line num = '))
print('line number='+str(line_num))
for i in range(len(names)):
_name = names[i]
ori_name = _name.split(SPLIT_CHAR)[len(_name.split(SPLIT_CHAR))-1]
dir_name = _name.replace(ori_name,'DIR_'+ori_name)
dir_name = dir_name.replace('.','_')
print ori_name
print dir_name
os.system('mkdir '+dir_name)
count = 1
print '已处理:'+str(count)+'行'
part_file = open(dir_name+SPLIT_CHAR+str(0)+'.part.txt','w')
with open(_name, 'rb') as f:
for line in f:
if count%line_num == 0:
part_file.close()
part_file = open(dir_name+SPLIT_CHAR+str(int(count/line_num))+'.part.txt','w')
part_file.write(line+'\n')
count+=1
if count%100000 == 0:
print '已处理:'+str(count)+'行'
print '已处理:'+str(count)+'行'
os.system('python ./get_name_logfile.py '+dir_name)
基于时间戳的文件重命名脚本
文件重命名逻辑:根据日志的开始和结束行时间戳进行重命名
使用方法如下:
python get_name_logfile.py log.txt
python get_name_logfile.py logs
参数支持指定单个文件或文件夹。若指定文件夹,脚本会处理该文件夹下的所有文件,但不会递归进入子文件夹。
# -*- coding:utf-8 -*-
import os,re,shutil
import sys
import platform
sys_name = platform.system().lower()
SPLIT_CHAR = '\\' if sys_name.find('windows') != -1 else '/'
_path = sys.argv[1]
names = []
files = []
pathes = []
if os.path.isfile(_path):
print('is file')
names[0] = _path
elif os.path.isdir(_path):
print('This is dir')
pathes = os.listdir(_path)
print('pathes='+str(pathes))
for i in range(len(pathes)):
fullpath = _path+SPLIT_CHAR+pathes[i]
print('fullpath='+fullpath)
if os.path.isfile(fullpath):
names.append(fullpath)
else:
print('is nothing')
print(len(names))
# 日期格式 : 05-26 18:20:42.093 r'\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}'
#
# 05-26 18:20:43.093:r'\d{2}-\d{2} {1,}\d{2}:\d{2}:\d{2}.\d{1,10}'
date_reg = r'\d{2}-\d{2} {1,}\d{2}:\d{2}:\d{2}.\d{1,10}'
time_reg = r'\d{2}:\d{2}:\d{2}.\d{1,10}'
for i in range(len(names)):
_name = names[i]
print('name='+_name)
# head 尝试在10行内查找日期
head_len = 10
start_time = '(start_time-'
_file_ = open(_name, 'rb')
reads = _file_.read()
_file = reads.split('\n')
if len(_file)/2 < 10:
head_len = len(_file)/2
for j in range(head_len):
res = re.search(date_reg, _file[j])
if res!=None and res.group(0)!=None:
start_time = res.group(0)
print('start_time='+start_time)
break
# tail
tail_len = len(_file)-head_len
end_time = '-end_time)'
for j in range(len(_file)-1,tail_len-1,-1):
res = re.search(time_reg, _file[j])
if res!=None and res.group(0)!=None:
end_time = res.group(0)
print('end_time='+end_time)
break
_file_.close()
ori_name = _name.split(SPLIT_CHAR)[len(_name.split(SPLIT_CHAR))-1]
print('ori_name='+ori_name)
new_name = start_time.replace(':','-')+'__'+end_time.replace(':','-')+os.path.splitext(ori_name)[1]
print('new_name='+new_name)
print("copy %s %s" % (_name, _name.replace(ori_name,new_name)))
#os.system ("copy %s %s" % (_name, _name.replace(ori_name,new_name)))
shutil.copy(_name,_name.replace(ori_name,new_name))
os.system ("rm -rf "+_name)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













