5

我需要记录我的 Web 应用程序的特定活动(基于 Python - 使用 Postgres 的 SQL alchemy)并且我不想在我的 Postgres 数据库中转储日志信息(为什么用大部分垃圾填充它?)或使用日志文件(很难搜索)。

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

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

问题是我还没有找到任何满足我需求的 python 工具,特别是异步需求。

有什么想法吗?

4

3 回答 3

4

Using the log collector daemon like Fluentd / Scribe / Flume, could be an another solution.

fluentd plus mongodb

These daemon is launched at every application nodes, and takes the logs from app processes. They buffer the logs and asynchronously writes out the data to other systems like MongoDB / PostgreSQL / etc. The write is done by batches, so it's a lot more efficient than writing directly from apps.

Here's two links of how to use Fluentd from Python, and how to put the data into MongoDB.

于 2012-11-15T21:14:11.327 回答
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>

于 2012-11-08T08:34:19.197 回答
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')
于 2018-02-05T08:14:20.093 回答