基于MongoDB的python日志功能

基于MongoDB的python日志功能

本文首發(fā)于 Gevin的博客

原文鏈接:基于MongoDB的python日志功能

未經(jīng) Gevin 授權(quán),禁止轉(zhuǎn)載

基于MongoDB的python日志功能

我?guī)讉€(gè)月前在《Python 日志功能詳解》中介紹了Python log模塊的基本使用方法攻询,但按照那篇文章的內(nèi)容組織州弟,還有一些東西不好放進(jìn)去展開低零,原本打算單獨(dú)開一篇文章把剩下的事情再講明白的拯杠,結(jié)果被各種事情耽誤,一直拖到現(xiàn)在潭陪,只能按照現(xiàn)在的思路繼續(xù)展開了。本文就講一下Python log 模塊與mongodb的結(jié)合老厌。

MongoDB是專為可擴(kuò)展性黎炉,高性能和高可用性而設(shè)計(jì)的數(shù)據(jù)庫,可以應(yīng)用于各種規(guī)模的企業(yè)慷嗜、各個(gè)行業(yè)以及各類應(yīng)用程序,其數(shù)據(jù)模式可以隨著應(yīng)用程序的發(fā)展而靈活地更新垦页。

服務(wù)器的日常運(yùn)維通常會(huì)產(chǎn)生大量的日志信息(如錯(cuò)誤干奢、警告和用戶行為),這些日志信息通常是以文本格式存儲(chǔ)于服務(wù)器本機(jī)的日志文件中忿峻。文本格式的日志雖然具有很好的可讀性,但每次都要打開服務(wù)器本機(jī)查看垄惧,使用和分析日志比較麻煩绰寞,再結(jié)合當(dāng)今微服務(wù)架構(gòu)的潮流,基于本機(jī)日志文件的日志存儲(chǔ)方式也會(huì)給開發(fā)和運(yùn)維帶來不少的附加的滤钱、可避免的工作量,將日志存儲(chǔ)于數(shù)據(jù)庫會(huì)可以讓使用和分析日志的更加高效铜靶。MongoDB性能高他炊,易于擴(kuò)展已艰,且schama freeness蚕苇,將日志存儲(chǔ)于 MongoDB 非常合適,有不少開發(fā)者和企業(yè)都把日志存儲(chǔ)于MongoDB中涩笤。

那么,基于Python開發(fā)時(shí)誊薄,如何用MongoDB存儲(chǔ)日志锰茉?

1. log4mongo-python

log4mongo-python 為Python logging 模塊提供了一個(gè) mongodb的handler切心,它依賴于pymongo driver,可以無縫應(yīng)用到Python logging 模塊绽昏,所以只要理解《Python 日志功能詳解》中介紹的內(nèi)容,log4mongo-python就能直接上手肤晓。因此本文不再贅述Python logging 模塊的使用认然,直接提供一個(gè)參考樣例(也可以在GitHub中查看最新版本):

#!/usr/local/bin/python
# -*- coding: utf-8 -*-

import logging
from log4mongo.handlers import MongoHandler

logger = logging.getLogger('mongo_example')

mon = MongoHandler(host='localhost', database_name='mongo_logs')
mon.setLevel(logging.WARNING)

ch = logging.StreamHandler()
ch.setLevel(logging.ERROR)

logger.addHandler(mon)
logger.addHandler(ch)


logger.debug('debug message')
logger.info('info message')
logger.warn('warn message')
logger.error('error message')
logger.critical('critical message')

上面例子中,使用MongoDB存儲(chǔ)日志的核心是創(chuàng)建了相應(yīng)的handler盈匾,即下面這一行:

mon = MongoHandler(host='localhost', database_name='mongo_logs')

創(chuàng)建MongoHandler非常簡(jiǎn)單毕骡,大部分參數(shù)都有默認(rèn)值,如果想配置更多參數(shù)未巫,直接看一下MongoHandler__init__函數(shù)即可:

def __init__(self, level=logging.NOTSET, host='localhost', port=27017,
                 database_name='logs', collection='logs',
                 username=None, password=None, authentication_db='admin',
                 fail_silently=False, formatter=None, capped=False,
                 capped_max=1000, capped_size=1000000, reuse=True, **kwargs)

2. 通過Dict對(duì)象配置log4mongo-python

基于我個(gè)人的開發(fā)實(shí)踐叙凡,中大型項(xiàng)目開發(fā)中,通過Dict配置logging模塊用的最多狭姨,由于log4mongo-python只是在logging模塊上增加了一個(gè)新的handler苏遥,所以Dict與《Python 日志功能詳解》中的寫法一致赡模,并根據(jù)實(shí)際情況賦上MongoHandler 初始化的參數(shù)值即可。舉例如下:

#!/usr/local/bin/python
# -*- coding: utf-8 -*-

import logging
import logging.config
from log4mongo.handlers import MongoHandler

config = {
    'version': 1,
    'formatters': {
        'simple': {
            'format': '%(asctime)s - %(name)s - %(levelname)s - %(message)s',
        },
    },
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
            'level': 'DEBUG',
            'formatter': 'simple'
        },
        'file': {
            'class': 'logging.FileHandler',
            'filename': 'logging.log',
            'level': 'DEBUG',
            'formatter': 'simple'
        },
        'mongo': {
            'class': 'log4mongo.handlers.MongoHandler',
            'host': 'localhost', 
            # 'port': 27017,
            'database_name': 'mongo_logs2',
            # 'collection': 'logs',
            'level': 'DEBUG',
        },
    },
    'loggers':{
        'root': {
            'handlers': ['console'],
            'level': 'DEBUG',
            # 'propagate': True,
        },
        'simple': {
            'handlers': ['console', 'file'],
            'level': 'WARN',
        },
        'mongo': {
            'handlers': ['console', 'mongo'],
            'level': 'DEBUG',
        }
    }
}

logging.config.dictConfig(config)


# print 'logger:'
# logger = logging.getLogger('root')

# logger.debug('debug message')
# logger.info('info message')
# logger.warn('warn message')
# logger.error('error message')
# logger.critical('critical message')


# print 'logger2:'
# logger2 = logging.getLogger('simple')

# logger2.debug('debug message')
# logger2.info('info message')
# logger2.warn('warn message')
# logger2.error('error message')
# logger2.critical('critical message')

print 'logger3:'
logger2 = logging.getLogger('mongo')

logger2.debug('debug message')
logger2.info('info message')
logger2.warn('warn message')
logger2.error('error message')
logger2.critical('critical message')

3. What's More教硫?

基于log4mongo將日志信息寫入MongoDB后辆布,可以通過RoboMongoMongoChef等MongoDB客戶端查看日志信息,并利用各種MongoDB的數(shù)據(jù)庫查詢語言景用,對(duì)日志進(jìn)行分析處理惭蹂。

題圖來自Logging Application Behavior to MongoDB 相關(guān)內(nèi)容。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末媚污,一起剝皮案震驚了整個(gè)濱河市廷雅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌航缀,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,013評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異丸凭,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來幢痘,“玉大人,你說我怎么就攤上這事购岗√” “怎么了喊积?”我有些...
    開封第一講書人閱讀 152,370評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵乾吻,是天一觀的道長。 經(jīng)常有香客問我绎签,道長,這世上最難降的妖魔是什么诡必? 我笑而不...
    開封第一講書人閱讀 55,168評(píng)論 1 278
  • 正文 為了忘掉前任擒权,我火速辦了婚禮阁谆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘场绿。我一直安慰自己,他們只是感情好璧尸,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,153評(píng)論 5 371
  • 文/花漫 我一把揭開白布熬拒。 她就那樣靜靜地躺著,像睡著了一般澎粟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上徐裸,一...
    開封第一講書人閱讀 48,954評(píng)論 1 283
  • 那天啸盏,我揣著相機(jī)與錄音,去河邊找鬼。 笑死次企,一個(gè)胖子當(dāng)著我的面吹牛潜圃,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播秉犹,決...
    沈念sama閱讀 38,271評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼型诚!你這毒婦竟也來了鸳劳?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,916評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤赏廓,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后摸柄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體既忆,經(jīng)...
    沈念sama閱讀 43,382評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,877評(píng)論 2 323
  • 正文 我和宋清朗相戀三年跃脊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了苛吱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,989評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡绘雁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出咧七,到底是詐尸還是另有隱情任斋,我是刑警寧澤耻涛,帶...
    沈念sama閱讀 33,624評(píng)論 4 322
  • 正文 年R本政府宣布瘟檩,位于F島的核電站,受9級(jí)特大地震影響墨辛,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜奏赘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,209評(píng)論 3 307
  • 文/蒙蒙 一太惠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧凿渊,春花似錦、人聲如沸埃脏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽佩谷。三九已至旁壮,卻和暖如春谐檀,著一層夾襖步出監(jiān)牢的瞬間裁奇,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評(píng)論 1 260
  • 我被黑心中介騙來泰國打工溃肪, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留音五,地道東北人惫撰。 一個(gè)月前我還...
    沈念sama閱讀 45,401評(píng)論 2 352
  • 正文 我出身青樓厨钻,卻偏偏與公主長得像,于是被迫代替她去往敵國和親夯膀。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,700評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • # Python 資源大全中文版 我想很多程序員應(yīng)該記得 GitHub 上有一個(gè) Awesome - XXX 系列...
    aimaile閱讀 26,441評(píng)論 6 428
  • 本文首發(fā)于Gevin的博客 原文鏈接:Python 日志功能詳解 未經(jīng) Gevin 授權(quán)蝴蜓,禁止轉(zhuǎn)載 軟件開發(fā)中通過...
    Gevin閱讀 4,872評(píng)論 1 24
  • GitHub 上有一個(gè) Awesome - XXX 系列的資源整理,資源非常豐富,涉及面非常廣俺猿。awesome-p...
    若與閱讀 18,615評(píng)論 4 418
  • 環(huán)境管理管理Python版本和環(huán)境的工具茎匠。p–非常簡(jiǎn)單的交互式python版本管理工具。pyenv–簡(jiǎn)單的Pyth...
    MrHamster閱讀 3,783評(píng)論 1 61
  • 生活節(jié)奏太快押袍,一天天總是感覺很快就過去了汽抚,每天抽點(diǎn)時(shí)間謝謝博客,至少將來某天看到伯病,自己還是寫過一些東西造烁,也避免自己...
    瘋狂的老鳥閱讀 123評(píng)論 0 0