使用pymongo解析文本格式日誌後放入mongo

思路


拿到的文本是二進制的,在查看文件的時候能夠加上-rb以二進制讀的形式打開。mongodb

文件格式以下:數據庫

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,行末尾有換行符njson

處理日誌文件的基本邏輯數組

  1. 連接數據庫
  2. 逐行讀txt
  3. 將一行的數據分割爲數組
  4. 將數據放入list
  5. 將list逐條轉化爲json
  6. 存入數據庫

分片集羣的mongo連接


用於存儲日誌的mongo集羣有三個分片:flux-stat-1.mongo:27017,flux-stat-2.mongo:27017和flux-stat-3.mongo:27017.app

假設用戶名是flux-stat,密碼是flux-stat-mongo123,登陸方法:url

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批量插入,效率明顯提升。code

db = client['log']             #獲取數據庫
coll = db[‘data’]              #獲取表
coll.insert_many(total)        #插入到數據庫
相關文章
相關標籤/搜索