我需要记录我的Web应用程序的特定活动(基于Python - 使用Postgres的SQL炼金术),我不想在Postgres数据库上转储日志信息(为什么要用垃圾填满?)或使用日志文件(难以搜索)。
理想情况下,我想将所有内容放在另一个数据库中,并以异步方式执行此操作。由于日志记录是异步的,因此我不需要担心写入操作失败并破坏执行所有重要业务的代码。此外,如果我错过了一些记录事件,那可能没什么大不了的。
Mongo似乎是一个很好的解决方案,因为它非常适合编写操作并且易于设置。
问题在于我没有设法找到任何满足我需求的python工具,尤其是异步需求。
有什么想法吗?
答案 0 :(得分:4)
使用日志收集器守护程序,如Fluentd / Scribe / Flume,可能是另一种解决方案。
这些守护程序在每个应用程序节点上启动,并从应用程序进程获取日志。它们缓冲日志,异步将数据写入其他系统,如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')