基于MongoDB的python日志功能

RitVHPP 7年前發布 | 34K 次閱讀 MongoDB Python NoSQL數據庫

基于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/

 

 本文由用戶 RitVHPP 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!