2010-10-11 39 views
1

J'écris une application Web basée sur Django qui importe un framework Cocoa via PyObjC. Le cadre Cocoa a NSLog() jeté tout au long et bien que je puisse les voir lors de l'exécution du serveur Django en mode non démon, dès que je vais au démon je perds simplement toute cette sortie utile NSLog().Comment faire fonctionner NSLog avec le module de journalisation de Python lors de l'utilisation de PyObjC?

Existe-t-il un moyen facile d'obtenir des informations de NSLog dans le monde du module Python logging afin qu'il puisse être fusionné avec les messages de journal émis par le code Python réel?

fait un peu googler et il semble que vous pourriez avoir à rediriger stderr et en quelque sorte le sucer de nouveau dans Python afin d'y parvenir, ce qui serait une sorte de ... bummer

Toute aide très appréciée.

Répondre

2

Selon this page NSLog fonctionne essentiellement comme

fprintf(stderr, format_string, args ...); 

donc vous avez besoin de capturer/rediriger la sortie d'erreur standard. J'ai écrit un post il y a quelque temps qui pourrait aider pour les programmes Python seulement, mais je suppose que le code Cocoa accède au descripteur de fichier de niveau processus 2 (stderr) sous les couvertures. Donc, vous aurez besoin de faire un peu de bidouillage de bas niveau avec le processus 'stderr. Voici un exemple:

old_stderr = os.dup(sys.stderr.fileno()) # keep a copy 
fd = os.open('path/to/mylog', os.O_CREAT | os.O_WRONLY) 
os.dup2(fd, sys.stderr.fileno()) 
# Now, stderr output, including NSLog output, should go to 'path/to/mylog' 
... 
os.dup2(old_stderr, sys.stderr.fileno()) 
#stderr restored to its old state 

Une fois que vous avez fd, vous pouvez créer un objet de type fichier hors de lui et de le transmettre à StreamHandler, par exemple, comme un moyen de fusionner la sortie du code Python et le code Cocoa.

+0

Merci pour l'info Vinay - Je m'en doutais. Je l'implémenterai et posterai ma solution actuelle pour la fusionner dans les logs de 'logging' de Python ici une fois que je l'ai fonctionné. – glenc

+0

Pour ce que ça vaut, ma solution finale à ce problème était d'arrêter réellement d'utiliser NSLog() et d'écrire mes propres macros de journalisation basées sur http://borkware.com/rants/agentm/mlog/ qui utiliseraient les niveaux de journalisation pour correspondre à la journalisation .error, logging.debug etc de Python. Les messages sont mis en mémoire tampon, puis une temporisation répétée dans Python fusionne les messages mis en tampon à partir de objc et de Python natif par heure et les émet dans le fichier journal réel. – glenc