2012-10-22 36 views
4

我需要記錄我的web應用程序的具體活動(基於Python - 使用Postgres的SQL鍊金術),而且我不想在我的Postgres數據庫上轉儲日誌信息(爲什麼要填寫它垃圾?)或使用日誌文件(難以搜索)。使用python和mongodb進行異步日誌記錄

理想情況下,我想將所有內容都放在另一個數據庫中,並以異步方式執行此操作。由於日誌記錄是異步的,我不需要擔心寫入操作失敗,並破壞執行所有重要業務的代碼。另外,如果我錯過了一些日誌記錄事件,這可能沒什麼大不了的。

Mongo似乎是一個很好的解決方案,因爲它非常適合編寫操作並且易於安裝。

問題是,我還沒有設法找到任何涵蓋我的需求,特別是異步要求的Python工具。

有什麼想法?

+0

退房[電機(http://emptysquare.net/blog/introducing-motor-an-asynchronous-mongodb-driver-for-python-and-tornado /)。默認情況下,[PyMongo](http://api.mongodb.org/python/current/)是即開即用的,但不是異步的。通過Motor,您可以在寫入本身時不掛起代碼,也不需要Mongo服務器的任何寫入確認。 – slee

回答

1

異步日誌記錄到MongoDB中可以通過在log4j中添加AsyncAppender來實現,它將引用一個真正的appender。

對於基本的瞭解,按照此http://wiki.python.org/jython/Log4jExample

log4mongo推數據轉換成mongo.Python驅動程序可在http://log4mongo.org/display/PUB/Log4mongo+for+Python

加入AsyncAppender將使僅供參考登錄異步方式

,相當於log4j的文件

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> 
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> 
<appender name="MongoDB" class="org.log4mongo.MongoDbAppender" > 
    <param name="hostname" value="127.0.0.1" /> 
    <param name="port" value="27017" /> 
    <param name="databaseName" value="LogDB"/> 
    <param name="collectionName" value="Log" /> 
</appender> 
<appender name="ASYNC" class="org.apache.log4j.AsyncAppender"> 
    <param name="BufferSize" value="50000"/> 
    <appender-ref ref="MongoDB"/> 
</appender> 
<root> 
    <level value="all"/> 
    <appender-ref ref="ASYNC"/> 
</root> 

4

使用日誌收集器守護進程Fluentd/Scribe/Flume,可以是另一種解決方案。

fluentd plus mongodb

這些守護進程在每一個應用程序節點啓動,並從應用程序需要的日誌。他們緩衝日誌和異步寫出數據到其他系統,如MongoDB/PostgreSQL /等寫入是由,所以它比從應用程序直接編寫更有效率。

下面是如何使用Python中的Fluentd以及如何將數據放入MongoDB的兩個鏈接。

0

我使用log4mongo可用PIP:

pip install log4mongo 

它允許使用默認記錄系統。 實施例(提取從DOC):

import logging 
from log4mongo.handlers import MongoHandler 

logger = logging.getLogger('test') 
logger.addHandler(MongoHandler(host='localhost')) 

logger.warning('test') 
相關問題