2011-11-12 2 views
2

Je veux enregistrer des informations dans mongodb en utilisant python. J'ai trouvé 2 bibliothèques mongodblog et log4mongo pour python. une idée de quel est le meilleur? ou toute autre bibliothèque qui est meilleure que celles-ci?Connexion à MongoDB à partir de python

Répondre

6

Lorsque vous utilisez MongoDB pour l'exploitation forestière, la préoccupation est l'affirmation de verrouillage par hauts débits d'écriture. Bien que l'insertion de MongoDB soit un style ignoré par défaut, l'appel de insert() provoque un conflit de verrouillage en écriture lourd. Cela peut affecter les performances de l'application et empêcher les lecteurs d'agréger/filtrer les journaux stockés.

Une solution pourrait être d'utiliser le cadre de collecteur journal tels que Fluentd, Logstash ou Flume. Ces démons sont censés être lancés sur tous les nœuds d'application et récupèrent les journaux des processus d'application.

Fluentd plus MongoDB

Ils tampon les journaux et de manière asynchrone écrit les données à d'autres systèmes comme MongoDB/PostgreSQL/etc L'écriture se fait par lots, il est donc beaucoup plus efficace que d'écrire directement à partir de applications. Ce lien décrit comment placer les journaux dans Fluentd à partir du programme Python.

Voici quelques tutoriels sur MongoDB + Fluentd.

3
+4

pymongo est un pilote mongodb pour python. cela n'a rien à voir avec la journalisation. – gsagrawal

+2

J'utilise du pymongo «cru» et c'est très simple de le faire de cette façon. Je ne pense pas que vous auriez beaucoup d'avantages de la bibliothèque dédiée à la journalisation python mongo. – grizwako

+0

Qu'est-ce que la journalisation différente de l'écriture de données dans une sorte de banque de données? Pas besoin d'utiliser des cadres fantaisistes ici. Cependant, c'est une très bonne suggestion. – RickyA

1

Pas besoin d'utiliser une bibliothèque de journalisation. Utilisez pymongo et procédez comme suit:

  1. créer une autre base de données à partir de votre base de données de l'application (il peut être sur la même machine) pour éviter des problèmes à haut débit d'écriture monopolisant le verrou que le reste de votre application peut avoir besoin.
  2. s'il y a une tonne de l'exploitation forestière à faire, pensez à utiliser une collection plafonnée
  3. si vous devez être analyser le journal car il se produit, écrire un script qui utilise un curseur tailable: http://docs.mongodb.org/manual/tutorial/create-tailable-cursor/

Le résultat est que tous vos besoins de journalisation peuvent être pris en charge avec quelques lignes de code. Encore une fois, pas besoin de compliquer votre base de code en introduisant des dépendances supplémentaires quand un peu de code suffira.

1

Comme mentionné par d'autres utilisateurs ici, il est assez simple de se connecter directement à l'aide 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') 

Vous pouvez expérimenter en remplaçant le _id avec l'horodatage, rappelez-vous juste que _id doit être unique.

Questions connexes