9
votes

Comment corroger des enregistreurs?

Travailler sur un projet qui nécessite que je sois capable de corner l'objet du conteneur à tout moment, car nous nous attendons à ce que cela échoue sur des conditions externes assez fréquemment et que vous puissiez récupérer complètement où nous nous sommes arrêtés.

I ' m Utilisation de la bibliothèque de journalisation Python de manière assez approfondie, et toutes mes classes commencent par configurer un enregistreur comme: xxx

car je décroche une classe de conteneur, il a plusieurs couches des classes en elle, chacune avec leur propre instance de Logger.

Maintenant, pour une raison quelconque, ces enregistreurs brisent le cornichon. Je reçois l'erreur suivante, qui s'en va si je supprime self.logger de toutes les classes: xxx

Donc, ma question est de savoir si une façon de supprimer ou non Les objets de verrouillage de tous les enregistreurs sans avoir à se recueillir à travers mon arborescence de mon objet entier supprimant les enregistreurs que je devrai recréer sur un impression sur un impeccable.


0 commentaires

5 Réponses :


5
votes

Vous pouvez créer une classe qui enveloppe l'enregistreur et les implements __ getstate __ et __ __ SetState __ .

Ceci est collé de http: //docs.python .org / bibliothèque / pickle.html . Le FH est traité de manière similaire à ce dont vous avez besoin. xxx


0 commentaires

2
votes

1 commentaires

Peut-être que vous pourriez être associé à (ou citer) la réponse exacte que vous avez utilisée? (Il y en a deux) il y a un bouton "lien" sous toute réponse que vous pouvez cliquer pour l'URL.



2
votes

Vous auriez pu utiliser dill code> ici, qui peut corroger des enregistreurs et des verrous.

>>> class foo:
...    def __init__(self):
...        self.logger = logging.getLogger("package.foo")
... 
>>> import dill
>>> import logging
>>> 
>>> f = foo()
>>> _f = dill.dumps(f)  
>>> f_ = dill.loads(_f)
>>> f_.logger
<logging.Logger object at 0x110b1d250>


0 commentaires

16
votes

Vous pouvez également créer une classe qui implémente une propriété qui renvoie l'enregistreur nécessaire. Chaque classe qui hérite de cette "loggermixin" est maintenant capable d'utiliser l'enregistreur de la même manière que vous l'utilisiez avant.

class LoggerMixin():
    @property
    def logger(self):
        component = "{}.{}".format(type(self).__module__, type(self).__name__)
        return logging.getLogger(component)

class Foo(LoggerMixin):
    def __init__(self):
        self.logger.info("initialize class")

    def bar(self):
        self.logger.info("execute bar")


1 commentaires

Ceci est une réponse négligée mais agréable.



3
votes

Nouveau dans Python 3.7 ( BPO30520 )

enregistreur peut maintenant être mariné comme beaucoup d'autres objets. xxx


1 commentaires

Juste une note, les enregistreurs peuvent être marinés; Cependant, tout ce qu'il fait est d'appeler getlogger à nouveau. Donc, si vous utilisez des multirocesses, vous devez toujours configurer la journalisation avant d'utiliser l'enregistreur de processus engendré.