2010-02-08 4 views
2

Mon application Web s'exécute sur des instances apache multipiles et j'ai des problèmes de journalisation multiprocessus à cause de cela. J'utilise actuellement un SocketHandler pour se connecter à un démon en utilisant SocketServer qui écrit ensuite les journaux dans un seul fichier journal (similar to this example).Catching errors lors de la connexion avec SocketHandler en Python

Maintenant que j'utilise un SocketHandler pour la journalisation, j'ai du mal à savoir si/quand le serveur de socket se bloque. Par exemple, si j'essaye de créer un SocketHandler pour un port qui n'a pas de serveur de socket d'écoute, aucune exception ne se produit. Je voudrais attraper ce type d'erreur et l'enregistrer dans un fichier.

Ma question est, lors de la connexion en utilisant SocketHandler comment puis-je savoir quand le socket utilisé n'est pas actuellement écouté?

Répondre

3

Lorsqu'une opération de création de socket échoue (par exemple parce qu'il n'y a pas d'écoute de serveur), le comportement par défaut est de réessayer la prochaine fois qu'un événement est consigné, avec un algorithme de retour exponentiel. Voici quelques approches que vous pouvez essayer:

  1. Sous SocketHandler, remplacer la méthode createSocket et gérer les exceptions comment vous allez dans votre mise en œuvre.
  2. Notez que l'attribut sock de l'instance SocketHandler sera None si aucun socket n'a encore été créé. Si la valeur est None après avoir enregistré un événement, le SocketHandler ne l'aurait probablement pas envoyé.
  3. Notez que la méthode makeSocket du gestionnaire est utilisée pour réellement créer et connecter le socket. Ainsi, vous pouvez appeler le makeSocket avant de vous connecter, et s'il y a une exception, vous savez que votre serveur n'écoute probablement pas. Si le résultat est positif, vous pouvez simplement fermer la valeur renvoyée.
  4. Sous SocketHandler, remplacer la méthode emit, et dans votre sous-classe, une référence à une instance de gestionnaire de remplacement (par exemple FileHandler ou SMTPHandler) que vous souhaitez utiliser. Dans votre code emit, essayez de créer le socket en utilisant

    if self.sock is None: 
        self.createSocket() 
    if self.sock is None: 
        # creation failed: do self.alternate_handler.handle(record) 
    else: 
        # creation succeeded: defer to superclass implementation 
    

Bien sûr, cela ne peut pas attraper des erreurs qui se produisent si le serveur tombe en panne au milieu d'envoyer un message, mais il devrait au moins vous avertir de certains problèmes avec vos serveurs.

+0

La méthode numéro 4 semble fonctionner pour moi jusqu'à présent. :) Je ne suis pas inquiet à l'idée d'attraper toutes les erreurs autant que de savoir si le socket semble être complètement défaillant. –

1

Il n'existe aucun moyen de le faire avec l'implémentation résiliente actuelle. "Résilient" signifie dans ce cas que le SocketHandler gérera déjà des problèmes avec le socket en essayant de le rouvrir dès qu'il y aura un problème. Il suffit de redémarrer le serveur et les gestionnaires se reconnecteront par la suite.

+0

Comment savoir quand redémarrer le serveur si les journaux sont silencieux? –

+0

Surveiller le processus du serveur. –