共计 1336 个字符,预计需要花费 4 分钟才能阅读完成。
思路
拿到的文本是二进制的,在查看文件的时候可以加上 -rb 以二进制读的形式打开。
文件格式如下:
b’2019-03-29 10:55:00\t0\192.168.31.123:8080\t5\t12345678\t0\t44560\t953864\t2\t192.168.31.123\tmd5\n’
可以看到日志里面的分隔符是制表符 t,行末尾有换行符 n
处理日志文件的基本逻辑
- 链接数据库
- 逐行读 txt
- 将一行的数据分割为数组
- 将数据放入 list
- 将 list 逐条转化为 json
- 存入数据库
分片集群的 mongo 链接
用于存储日志的 mongo 集群有三个分片:flux-stat-1.mongo:27017,flux-stat-2.mongo:27017 和 flux-stat-3.mongo:27017.
假设用户名是 flux-stat,密码是 flux-stat-mongo123,登录方法:
from pymongo import MongoClient
import urllib.parse
#创建 MongoDB 链接对象
username = urllib.parse.quote_plus(‘flux-stat’)
password = urllib.parse.quote_plus(‘flux-stat-mongo123’)
uri = 'mongodb://%s:%s@flux-stat-1.mongo:27017, flux-stat-2.mongo:27017, flux-stat-3.mongo:27017/admin' % (username,password)
client = MongoClient(uri)
注意:username 和 password 必须要进行转换,否则链接不正确
pymongo 逐行读取日志文本
with open(“d:/user/ServerLog/test.txt”,’rb’) as file:
for line in file:
#这里放操作
file.close()
分割日志内容转化为 json,并把每行 json 放到数组中
# 引入 json 模块
import json
total=[]
logList = line.split(‘\t’) #line 分割为 list
keyList = [‘time’,’status’,’ip’,’type’,’userid’,’v1’,’v2’,’v3’,’v4’,’ip’,’md5’] #key 的 list
logDict = dict(zip(keyList, logList)) #把二者以字典的方式拼起来
logJson = json.dumps(logDict) #把字典转换为 string 形式的 json
#json 转字典的方法为 dictinfo = json.loads(json_str)
total.append(logJson)
日志存入 mongo
insert_one 和 insert_many 是两种插入的方式,但是采用 insert_one 进行逐条插入会进行大量的访问,大幅降低插入效率,采用 insert_many 进行 json 为基本单位的 list 批量插入,效率明显提高。
db = client['log'] #获取数据库
coll = db[‘data’] #获取表
coll.insert_many(total) #插入到数据库
正文完