Résolue

Problème avec loguru.patch() dans une configuration de logger en fonction

# Python # Gestion des erreurs # Module logging

loguru.patch() non appliqué

Bonjour à tous!

J'essaie de mettre en place un système de logs, avec envoi auto d'un message pushover en cas d'erreur.
Pour ce faire, j'utilise loguru et pushover.
Lorsque je définis mon logger de façon globale (pas dans une fonction), tout fonctionne:

def error_callback(record: dict) -> None:
    """ "
    Function to be executed when logger.error is called.
    """
    if record['level'].name == 'ERROR':
        send_pushover_msg(
            message=f"{record['level'].icon} {record['level'].name} - {record.get('message')}"
        )


def send_pushover_msg(message: str, title: str = project_name) -> None:
    """
    Send message through pushover mobile application.
    """
    pushover_config_file = home_dir / '.pushover.ini'
    config = configparser.ConfigParser()
    config.read(pushover_config_file)
    pushover_user = config.get('global', 'PUSHOVER_USER')
    pushover_token = config.get('global', 'PUSHOVER_TOKEN')
    conn = http.client.HTTPSConnection('api.pushover.net:443')
    conn.request(
        'POST',
        '/1/messages.json',
        urllib.parse.urlencode(
            {
                'token': pushover_token,
                'user': pushover_user,
                'title': title,
                'message': message,
            }
        ),
        {'Content-type': 'application/x-www-form-urlencoded'},
    )


logger.remove()
logger.add(
    sys.stderr,
    colorize=True,
    format='<green>{time:YYYY-MM-DD HH:mm:ss}</green> <level>{level}</level> {message}',
    level='INFO',
)
logger = logger.patch(error_callback)

En revanche, si j'essaie de définir mon logger dans une fonction, je ne parviens plus à appeler la fonction error_callback:

def loguru_base_config() -> loguru._logger.Logger:
    logger.remove()
    logger.add(
        sys.stderr,
        colorize=True,
        format='<green>{time:YYYY-MM-DD HH:mm:ss}</green> <level>{level}</level> {message}',
        level='INFO',
    )

    return logger


def main():
    logger = loguru_base_config()
    logger = logger.patch(error_callback)

Le seul moyen pour que la fonction error_callback soit appelée en cas de logger.error, est de passer logger en paramètre dans mes fonctions (dans main()).

Auriez-vous une idée svp pour que le patch soit bien appliqué au logger de façon globale dans le script (j'espère que j'ai réussi à être clair dans mon explication! ^^) ?

Merci d'avance pour votre aide! :)

J'ai finalement pû faire autrement.
Je suis passé par la méthode filter :

def loguru_base_config() -> loguru._logger.Logger:
    logger.remove()
    logger.add(
        sys.stderr,
        colorize=True,
        format='<green>{time:YYYY-MM-DD HH:mm:ss}</green> <level>{level}</level> {message}',
        level='INFO',
    )
    logger.add(
        LOG_DIR / f'{project_name.lower()}.log',
        format='{time} {level} {message}',
        level='INFO',
        rotation='1 day',
        retention='30 days',
        filter=error_callback
        )

De cette façon, la fonction error_callback est bien exécutée à chaque fois.

Inscris-toi

(c'est gratuit !)

Inscris-toi

Tu dois créer un compte pour participer aux discussions.

Créer un compte

Rechercher sur le site

Formulaire de contact

Inscris-toi à Docstring

Pour commencer ton apprentissage.

Tu as déjà un compte ? Connecte-toi.