2012-10-22 3 views
4

J'ai besoin d'enregistrer des activités spécifiques de mon application web (basée sur Python - alchimie SQL avec Postgres) et je ne veux pas non plus vider les informations du journal sur ma base de données Postgres (pourquoi le remplir poubelles?) ou utiliser un fichier journal (difficile à chercher).journalisation asynchrone avec python et mongodb

Idéalement, je voudrais tout jeter dans une autre base de données et le faire de manière asynchrone. La journalisation étant asynchrone, je n'ai pas besoin de m'inquiéter de l'échec de l'opération d'écriture et de la rupture du code qui fait tout le travail important. Aussi, si je manque quelques événements d'enregistrement, ce n'est probablement pas une grosse affaire.

Mongo semble être une excellente solution car il est bien adapté aux opérations d'écriture et facile à installer.

Le problème est que je n'ai pas réussi à trouver des outils python qui couvrent mes besoins et en particulier les exigences asynchrones.

Des pensées?

+0

Check out [moteur] (http://emptysquare.net/blog/introducing-motor-an-asynchronous-mongodb-driver-for-python-and-tornado /). Par défaut, [PyMongo] (http://api.mongodb.org/python/current/) est fire-and-forget mais n'est pas asynchrone. Avec Motor, vous pouvez vous connecter sans votre code suspendu à l'écriture elle-même ni à toute confirmation d'écriture par le serveur Mongo. – slee

Répondre

1

La connexion asynchrone dans mongodb peut être réalisée en ajoutant AsyncAppender dans log4j qui se référera à un réel appender.

Pour suivre cette compréhension de base http://wiki.python.org/jython/Log4jExample

log4mongo POUSSE données dans pilote mongo.Python est disponible à http://log4mongo.org/display/PUB/Log4mongo+for+Python

ajoutant AsyncAppender fera la connexion manière asynchrone

juste pour la référence, le fichier log4j équivalent

<?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

Utilisation du démon collecteur journal comme Fluentd/Scribe/Flume, pourrait être une autre solution.

fluentd plus mongodb

Ce démon est lancé à tous les nœuds d'application, et prend les journaux des processus d'application. Ils tamponnent les journaux et écrit de manière asynchrone les données vers d'autres systèmes comme MongoDB/PostgreSQL/etc. L'écriture est effectuée par lots, donc c'est beaucoup plus efficace que d'écrire directement à partir d'applications.

Voici deux liens sur l'utilisation de Fluentd à partir de Python et sur la façon de placer les données dans MongoDB.

0

J'utilise log4mongo disponible avec pip:

pip install log4mongo 

Il permet l'utilisation du système d'enregistrement et par défaut . Exemple (extrait du document):

import logging 
from log4mongo.handlers import MongoHandler 

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

logger.warning('test') 
Questions connexes