2010-02-13 6 views
4

J'ai créé une implémentation simple Python XML-RPC, largement basée sur les exemples.Comment gérer les sorties et les exceptions Python XML-RPC?

Cependant, il envoie une sortie comme ceci:

foo.bar.com - - [13/Feb/2010 17:55:47] "POST /RPC2 HTTP/1.0" 200 - 

... au terminal, même si je rediriger la sortie standard et l'erreur standard à un fichier en utilisant >> ou >. Je le fais avec la ligne suivante:

python foobar 2>&1 >> foobar.log 

Il semble presque que ce n'est pas l'envoi standard, mais ailleurs.

En outre, lorsqu'une exception se produit sur recieving une demande, l'ensemble application se bloque avec cette erreur:

---------------------------------------- 
Exception happened during processing of request from ('1.2.3.4', 51284) 

Comment puis-je gérer cette exception? J'ai besoin de récupérer gracieusement, et il suffit de se connecter le message d'exception plutôt que le plantage du serveur.

Répondre

5

Je suppose que vous utilisez la classe SimpleXMLRPCServer à partir des exemples. Dans ce cas, il suffit de fournir le paramètre logRequests lors de sa création:

server = SimpleXMLRPCServer(("localhost", 8000), logRequests = False) 

qui supprimera l'enregistrement de la demande.

En ce qui concerne les exceptions, ils sont enregistrés dans BaseServer (voir le code source de "SocketServer.py"):

def handle_error(self, request, client_address): 
    """Handle an error gracefully. May be overridden. 

    The default is to print a traceback and continue. 

    """ 
    print '-'*40 
    print 'Exception happened during processing of request from', 
    print client_address 
    import traceback 
    traceback.print_exc() # XXX But this goes to stderr! 
    print '-'*40 

Comme vous pouvez le voir, la première partie est écrite stdout, qui est pourquoi ne fonctionnait pas complètement. Si vous souhaitez les supprimer, remplacez ou remplacez cette méthode.

+0

Comment puis-je rediriger les requêtes de journal à un autre endroit? Par exemple, une instance de 'logging.getLogger()'. De même, comment l'application plante-t-elle lorsque l'exception est imprimée? –

+0

Comme vous pouvez le voir dans le code entre guillemets ("SocketServer.py" de la bibliothèque standard, qui est utilisée indirectement par 'xmlrpclib'), l'application ne plante pas lorsqu'une exception se produit, elle est simplement ignorée. Si vous souhaitez rediriger ces journaux, vous pouvez écrire vos propres classes 'BaseServer' /' BaseHTTPServer'/'SimpleXMLRPCServer' (dérivées les unes des autres), ou simplement remplacer les fonctions de journalisation, par ex. 'SocketServer.BaseServer.handle_error = yourLogHandlerWhichWritesToLogger'. – AndiDog

0

Ceci est vraiment un problème de redirection de shell, pas un problème de python. Quand vous dites

python foobar 2>&1 >> foobar.log 

Vous êtes premier redirigeant stderr à stdout, puis secondes rediriger stdout vers foobar.log. stderr n'est pas automatiquement redirigé vers foobar.log. stderr pointe toujours sur la sortie stdout d'origine.

Ainsi, au lieu faire ceci:

python foobar >> foobar.log 2>&1 

Voir aussi http://bash-hackers.org/wiki/doku.php/syntax/redirection (recherche de "multiples") redirections

+0

Je ne pourrais jamais obtenir le coup de la redirection de sortie ha. Peut-être que je ne le ferai jamaisJe l'utilise beaucoup dans mon crontab, alors peut-être que je devrais vérifier ce premier à l'avenir pour référence. –

Questions connexes