项目架构发生了变化,原来的单机单应用要部署成集群了。这样在排查问题看日志的时候就不太方便了。最近想起来可以将日志按用户打印,也就是每个用户一个日志文件(整个系统最多一万个用户整个还是没得问题的)通过一个程序将分布在多台上的日志文件下载到本地然后在做一个按日志内容(每一行有个时间戳)的排序。
上班的地方上不了外网,所以程序在我的电脑上调试了。本地的环境是python2.7 ,开发工具是eclipse+pydev ,习惯了使用eclipse 使用这个开发工具调试python很方便。
程序的主要逻辑分三步:
第一步:用ftp下载目标日志文件到本地,目标日志可能分布在不同的ip上。
第二步:将多个日志的内容装到dict对象。日志的时间戳是键 ,时间戳那一行是值。然后排序。
第三步:输出到指定文件
第一次写python程序,代码不太优美:
#!/bin/env python
#coding=gbk
import sys
import os
import re
import datetime
from ftplib import FTP
'''将一个用户的多个日志进行排序,排序后输出一个日志'''
'''运行方式 python getUserLog TNT3.TNT301
及:ptyhon命令 程序文件名 机构用户号'''
#ftp下载目标用户日志
def ftp_down():
ftp = FTP()
ftp.set_debuglevel(0)
ftp.connect(ftpip,21)
ftp.login(userid,pswd)
#ftp.login()
#print ftp.getwelcome()
#print ftp.pwd()
print ftp.dir()
filename = bankuserid+'.log'
with open(filename,'wb') as file_handler:
ftp.retrbinary('RETR '+filename, file_handler.write)
file_handler.close()
ftp.quit()
print '从 '+ftpip+'下载 '+filename+' 成功'
#将配置的路径下的用户日志加载到字典和列表
def loadFiles(logPath,logFilesList):
userLogFileName = []
#字典
userLogMap = {}
for userFilePath in logFilesList:
if os.path.isfile(logPath+userFilePath) and bankuserid in userFilePath:
userLogFileName.append(logPath+userFilePath)
print '将'+userFilePath+'放入了 列表'
#循环读取日志文件的内容
for ulfn in userLogFileName:
#open函数文件名不支持“-”不知道是位什么
with open(ulfn,'rb') as tempFile:
row_key = ''
row_value= ''
last_row_key=''
last_row_value=''
row_key_count = 0
while True:
line = tempFile.readline()
if not line:
break
#匹配日期
r1 = re.compile('^([0-9]{4}-[0-9]{2}-[0-9]{2}[ \t\n\r\r\v][0-9]{2}[:][0-9]{2}[:][0-9]{2}[\.][0-9]{3})')
#如果匹配 先将上一轮的key和value写到列表和字典
if r1.match(line):
row_key_count = row_key_count+1
row_key_count_str = seq(str(row_key_count),7)
if not last_row_key.__eq__(''):
last_rwo_key = last_row_key+'.'+row_key_count_str
userLogMap[last_rwo_key] = last_row_value
#print '字典中增加:key:'+last_rwo_key+' value'
row_key =''
row_value = ''
last_row_key = ''
last_row_value = ''
#又定义新的
row_key = re.findall(r1,line)
row_value = line
last_row_key = row_key[0]
last_row_value = row_value
else:
last_row_value =last_row_value+line
#最后要写一次
if not last_row_key.__eq__(''):
#print '字典中增加:'+last_row_value
userLogMap[last_row_key] = last_row_value
tempFile.close()
print('加载日志内容到dic成功。一共有'),
print(len(userLogMap)),
print('个时间戳')
return userLogMap
#对元组内的数据进行升序排序
def sortColl(arg1):
m = sorted(arg1.iteritems(), key=lambda d:d[0], reverse = False)
return m
#arg1是map容器;arg2是产生的结果文件路径
def write2file(arg1,arg2):
with open(arg2,'wb+') as tempFile:
for row in arg1:
#print row
tempFile.write(row[1])
print('生成'+arg2+'成功')
tempFile.close
#将str的长度补到len位(不足时前面加0)
def seq(seqStr,seqLen):
if len(seqStr)>seqLen:
return seqStr
else:
return seq('0'+seqStr,seqLen)
#定义初始化的日志文件路径
logPath = r'E:/python code/'
ftpip = '192.168.1.100'#ftp的ip
userid = 'Feng'#ftp用户名
pswd = 'soft'#ftp密码
bankuserid = 'TNT3.TNT301'#目标用户的 机构号用户编号如TNT3.TNT301
'''argCount = len(sys.argv)
#如果未传用户名则退出
if argCount<2:
print('请输入用户编号')
sys.exit()
else:
bankuserid = sys.argv[1]
print(bankuserid)'''
logFilesList = os.listdir(logPath)
print logPath,'目录下的文件有:共',len(logFilesList),'个'
#开始调用
time_ftp_start = datetime.datetime.now().microsecond
print '开始用ftp下载'
#ftp_down()
time_ftp_end = datetime.datetime.now().microsecond
print 'ftp下载结束,耗时',(time_ftp_end-time_ftp_start)/1000,'ms。开始加载到dic'
userLogMap = loadFiles(logPath,logFilesList)
time_load_end = datetime.datetime.now().microsecond
print '加载到dic结束,耗时',(time_load_end-time_ftp_end)/1000,'ms。开始排序'
userLogMap = sortColl(userLogMap)
time_sort_end = datetime.datetime.now().microsecond
print '排序结束,耗时',(time_sort_end-time_load_end)/1000,'ms。开始输出到磁盘'
write2file(userLogMap,r'c:\result.log')
time_write_end = datetime.datetime.now().microsecond
print '输出到磁盘结束,耗时',(time_sort_end-time_load_end)/1000,'ms'
分享到:
相关推荐
这个需求通常出现在数据处理或文本分析的场景中,例如,你可能有一个包含多个日志文件的文件夹,想把它们整合到一起进行统一分析。 **二、合并效果** 合并后,所有的TXT文件内容将被整合到一个新创建的文件中,每...
6. **多设备并行测试**:Python支持多线程和异步操作,可以同时对多个设备进行Monkey测试,提高测试效率。 7. **持续集成**:Python Monkey工具可以很容易地整合到持续集成系统(如Jenkins、Travis CI)中,实现...
"文件夹合并器"是一个工具,它能够帮助用户有效地整合多个子文件夹的内容,将其合并到一个新的单一文件夹中,从而简化文件结构,提高工作效率。这个功能在处理大量分散的文件时特别有用,比如在整理文档、图片或者...
"TXT文件合并器"是一款专为处理纯文本文件设计的实用工具,主要用于将多个TXT格式的文本文件整合成一个单一的文件。在日常工作中,我们可能会遇到需要将多个相关的TXT文档整理成一份完整资料的情况,这时,TXT文件...
"多文件合并"这个主题涉及到如何将多个独立的文件整合成一个单一的文件,以方便管理和传输。以下是一些关于这个主题的重要知识点: 1. **文件合并的概念**: 文件合并是指将两个或多个文件内容整合到一起,形成一...
7. 数据整合:将多种类型的数据合并到一张图像中,展示了Python对数据整合的强大能力,这可能涉及到pandas的merge或concat函数,以及matplotlib的子图布局功能。 8. 性能优化:在处理大量数据时,Python可能需要...
最后,Allure将这些结果整合成一个可视化的报告,便于分析和问题定位。 PythonProject的压缩包可能包含以下文件结构和内容: 1. `tests` 目录:包含Pytest的测试用例文件,每个文件可能对应一个测试类或模块。 2. ...
PyInstaller的核心功能是将Python脚本、依赖库和其他资源文件整合成一个或多个独立的可执行文件,使得非Python环境的用户也能运行程序。其工作原理主要包括以下步骤: 1. **分析依赖**:PyInstaller首先会扫描输入...
- 数据分析:将多份日志文件合并,便于统一分析。 - 文档整理:将不同章节的文本文件组合成一本书或报告。 - 代码管理:开发人员可以将分散的源代码文件合并为一个单一的文件进行查看或备份。 - 教学资料:教师...
"多个TXT文件合并"这个主题就是针对这样的需求,它旨在教你如何有效地整合多个纯文本文件(.txt格式)成一个单一的文件,以便于管理和阅读。下面,我们将深入探讨这个过程,并提供几种实现方式。 首先,我们可以...
7. **脚本封装与自动化**:将上述过程封装成一个Python脚本,通过命令行参数或配置文件指定PPT文件路径,就可以实现一键运行,自动化抓取多个PPT文件中的文字。 8. **错误处理与日志记录**:为了提高程序的健壮性,...
当有多个文件需要整合成一个单一的文件时,就需要进行文件合并。在编程领域,这通常通过读取每个文件的内容并写入新文件来实现。例如,我们可以使用Python语言编写一个简单的脚本来完成这个任务: ```python import...
"txt合并"这个主题就是关于如何将多个纯文本(.txt)文件整合成一个单一的文档,便于阅读、管理和分析。这个过程可以手动操作,但更常见的是通过编写脚本或使用特定的软件工具来自动化完成。 首先,我们需要了解....
4. **日志聚合**:在系统监控中,多个日志文件可以合并成一个文件,便于分析和查找问题。 在编程中,Python 提供了 `cat` 命令(在 Linux/Unix 环境)或 `concatenate` 函数(在 Python 中)来实现文本文件的合并。...
- **测试结果汇总**:将所有测试用例的执行结果整合成一个整体视图,便于快速查看测试的总体成功率。 - **测试结果分类**:根据测试结果的类型(如成功、失败、警告)进行分类,方便用户快速定位问题。 - **报告...
使用`django-urlconf-export`,开发者可以将多个分散的URL配置文件整合成一个可读性更强、结构更清晰的文件。此外,该库支持自定义导出格式,如XML、JSON等,这使得与其他系统集成变得更加容易。例如,你可以轻松地...
5. **tar.gz格式**:这种压缩格式将所有项目文件打包成一个文件,便于传输和存储。在Python开发中,通常用于分发源代码包,而不是预编译的二进制文件。 6. **Python库的使用**:在Python项目中,通过`pip install ...
5. **日志整合**:将多个dump文件的分析结果整合成一份报告,便于整体理解和对比。 6. **自动化修复建议**:在某些情况下,可以依据dump文件信息生成自动化修复建议,如更新库文件、修复配置等。 在实际操作中,...
".tar"是一个打包工具,它能将多个文件和目录组合成一个单一的归档文件;而".gz"则是gzip的压缩格式,用于减少文件大小,便于存储和传输。用户可以通过解压此文件,查看源代码,理解库的工作原理,甚至对其进行修改...
这个场景涉及到从两个不同的文件中读取数据,按照特定的顺序(本例中为字母顺序)进行整合,并将结果写入一个新的文件。让我们详细探讨一下这个过程涉及的关键知识点。 1. **文件操作**:在编程中,我们需要使用...