使用python和mongodb进行异步日志记录

时间:2012-10-22 13:04:25

标签: python mongodb logging asynchronous

我需要记录我的Web应用程序的特定活动(基于Python - 使用Postgres的SQL炼金术),我不想在Postgres数据库上转储日志信息(为什么要用垃圾填满?)或使用日志文件(难以搜索)。

理想情况下,我想将所有内容放在另一个数据库中,并以异步方式执行此操作。由于日志记录是异步的,因此我不需要担心写入操作失败并破坏执行所有重要业务的代码。此外,如果我错过了一些记录事件,那可能没什么大不了的。

Mongo似乎是一个很好的解决方案,因为它非常适合编写操作并且易于设置。

问题在于我没有设法找到任何满足我需求的python工具,尤其是异步需求。

有什么想法吗?

3 个答案:

答案 0 :(得分:4)

使用日志收集器守护程序,如Fluentd / Scribe / Flume,可能是另一种解决方案。

fluentd plus mongodb

这些守护程序在每个应用程序节点上启动,并从应用程序进程获取日志。它们缓冲日志,异步将数据写入其他系统,如MongoDB / PostgreSQL等。写入由批次完成,因此它比直接写入更有效率来自应用程序。

以下是如何使用Python的Fluentd以及如何将数据放入MongoDB的两个链接。

答案 1 :(得分:0)

异步登录到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>

答案 2 :(得分:0)

我正在使用pip提供的log4mongo

pip install log4mongo

它允许使用默认的日志记录系统。 示例(从文档中提取):

import logging
from log4mongo.handlers import MongoHandler

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

logger.warning('test')