本文首發(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后辆布,可以通過RoboMongo或MongoChef等MongoDB客戶端查看日志信息,并利用各種MongoDB的數(shù)據(jù)庫查詢語言景用,對(duì)日志進(jìn)行分析處理惭蹂。
題圖來自Logging Application Behavior to MongoDB 相關(guān)內(nèi)容。