基于MongoDB的python日志功能
基于MongoDB的python日志功能
我幾個月前在《Python 日志功能詳解》中介紹了Python log模塊的基本使用方法,但按照那篇文章的內容組織,還有一些東西不好放進去展開,原本打算單獨開一篇文章把剩下的事情再講明白的,結果被各種事情耽誤,一直拖到現在,只能按照現在的思路繼續展開了。本文就講一下Python log 模塊與mongodb的結合。
MongoDB是專為可擴展性,高性能和高可用性而設計的數據庫,可以應用于各種規模的企業、各個行業以及各類應用程序,其數據模式可以隨著應用程序的發展而靈活地更新。
服務器的日常運維通常會產生大量的日志信息(如錯誤、警告和用戶行為),這些日志信息通常是以文本格式存儲于服務器本機的日志文件中。文本格式的日志雖然具有很好的可讀性,但每次都要打開服務器本機查看,使用和分析日志比較麻煩,再結合當今微服務架構的潮流,基于本機日志文件的日志存儲方式也會給開發和運維帶來不少的附加的、可避免的工作量,將日志存儲于數據庫會可以讓使用和分析日志的更加高效。MongoDB性能高,易于擴展,且 schama freeness ,將日志存儲于 MongoDB 非常合適,有不少開發者和企業都把日志存儲于MongoDB中。
那么,基于Python開發時,如何用MongoDB存儲日志?
1. log4mongo-python
log4mongo-python 為Python logging 模塊提供了一個 mongodb的handler,它依賴于 pymongo driver ,可以無縫應用到Python logging 模塊,所以只要理解《Python 日志功能詳解》中介紹的內容,log4mongo-python就能直接上手。因此本文不再贅述Python logging 模塊的使用,直接提供一個參考樣例
#!/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')</code></pre>
上面例子中,使用MongoDB存儲日志的核心是創建了相應的handler,即下面這一行:
mon = MongoHandler(host='localhost', database_name='mongo_logs')
創建MongoHandler非常簡單,大部分參數都有默認值,如果想配置更多參數,直接看一下 MongoHandler 的 __init__ 函數即可:
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對象配置log4mongo-python
基于我個人的開發實踐,中大型項目開發中,通過Dict配置logging模塊用的最多,由于 log4mongo-python 只是在logging模塊上增加了一個新的handler,所以Dict與《Python 日志功能詳解》中的寫法一致,并根據實際情況賦上 MongoHandler 初始化的參數值即可。舉例如下:
#!/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')</code></pre>
來自:http://blog.igevin.info/posts/python-logging-with-monogodb/