2011-11-12 82 views
2

我想使用python将一些信息记录到MongoDB中。我发现了两个库mongodblog和log4mongo for python。任何想法哪一个更好?或者比这些更好的其他图书馆?从python登录到MongoDB

回答

6

当您使用MongoDB的日志记录,值得关注的是高写入吞吐量的锁争。尽管默认情况下MongoDB的插入是默认情况下的fire-and-forget样式,调用大量insert()会导致严重的写入锁争用。这可能会影响应用程序性能,并阻止读者聚合/筛选存储的日志。

的一个解决方案可能使用的日志收集器框架FluentdLogstash,或Flume。这些守护进程应该在每个应用程序节点上启动,并从应用程序进程获取日志。

Fluentd plus MongoDB

他们缓冲日志和异步写出来的数据到其他系统,如MongoDB的/ PostgreSQL的/等写入由批次完成的,所以这是一个很大比直接写更有效应用。该链接描述了如何将日志从Python程序放入Fluentd中。

下面是关于MongoDB的+ Fluentd一些教程。

3
+4

pymongo是python的mongodb驱动程序。它与记录无关。 – gsagrawal

+2

我使用'raw'pymongo,这样做非常简单。我不认为你会从专用的python mongo日志库中获得很多好处。 – grizwako

+0

什么是记录不同比写datalines某种数据存储?这里不需要使用花哨的框架。 Fluent却是一个非常好的建议。 – RickyA

1

无需使用日志库。使用pymongo并执行以下操作:

  1. 从应用程序数据库中创建不同的数据库(它可以在同一台机器上),以避免与高写入吞吐量问题霸占锁定您的应用程序的其他部分可能需要。
  2. 如果有一吨的日志记录的工作要做,考虑使用加盖收集
  3. ,如果你需要它时,写一个使用tailable光标另一个脚本进行分析日志:http://docs.mongodb.org/manual/tutorial/create-tailable-cursor/

结果是所有的日志需求都可以通过几行代码来处理。同样,当一些代码足够时,不需要通过引入额外的依赖关系来使代码库复杂化。

1

正如其他用户提到这里,它是直接使用pymongo登录很简单:

from pymongo import MongoClient 
from pymongo import ASCENDING 
import datetime 

client = MongoClient() 
db = client.my_logs 
log_collection = db.log 
log_collection.ensure_index([("timestamp", ASCENDING)]) 


def log(msg): 
    """Log `msg` to MongoDB log""" 
    entry = {} 
    entry['timestamp'] = datetime.datetime.utcnow() 
    entry['msg'] = msg 
    log_collection.insert(entry) 

log('Log messages like this') 

您可能希望通过与时间戳更换_id做实验,只记得_id必须是唯一的。