2
votes

Ajouter des informations à chaque message de journal dans la journalisation Python

J'utilise Python avec le module de journalisation et je voudrais ajouter le socket.hostname () à chaque message de journal, je dois exécuter cette requête à chaque message et je ne peux pas utiliser

name = socket.hostname() 

puis format de journalisation avec le nom

Je regarde cet exemple d'utilisation du filtre de journalisation, mais ce dont j'ai besoin ici, ce n'est pas un filtre, c'est une simple manipulation de chaque message de journal.

Comment puis-je obtenir le résultat souhaité?


1 commentaires

Que diriez-vous de décorer la fonction de journalisation?


3 Réponses :


0
votes

Vous pouvez configurer le module de logging en ajoutant une option de format personnalisé comme ceci

import logging

name = socket.hostname() 
logMessageFormat = '{}: %(levelname)s:%(message)s'.format(name)
logging.basicConfig(format=logMessageFormat, level=logging.DEBUG)

# Test new configuration
logger = logging.getLogger()
logger.info('Hello world')

# should print to the console
# <socketHostName>: INFO:Hello world

Vous pouvez en savoir plus sur la personnalisation du format des messages affichés ici https://docs.python.org/3/howto/logging.html#changing-the-format-of-displayed-messages


1 commentaires

Désolé, cela est explicitement opposé à ce qui est nécessaire dans l'OP, j'ai besoin que socket.gethostname () soit appelé chaque msg de journal, et pas une fois



2
votes

Vous pouvez utiliser le filtre pour ajouter des informations à chaque message:

import logging
import socket

class ContextFilter(logging.Filter):
    def filter(self, record):
        record.hostname = socket.gethostname() 
        return True

if __name__ == '__main__':
    levels = (logging.DEBUG, logging.INFO, logging.WARNING, logging.ERROR, logging.CRITICAL)
    logging.basicConfig(level=logging.DEBUG,
                        format='%(asctime)-15s hostname: %(hostname)-15s : %(message)s')
    a1 = logging.getLogger('a.b.c')
    f = ContextFilter()
    a1.addFilter(f)
    a1.debug('A debug message')


0 commentaires

0
votes

Cela s'appuie sur la réponse de Philippe lors de l'utilisation de dictConfig . Le filtre contextuel illustré dans cette réponse utilise psutil pour consigner le pourcentage d'utilisation actuel du processeur et de la mémoire dans chaque message de journal.

Enregistrez ce fichier dans say mypackage/util/logging.py :

2020-05-16 01:06:08,973 INFO c68m51 3c:MainThread:mypackage.mymodule:27:myfunction: This is my log message.

Notez qu'une fonction de filtre ne fonctionnait pas pour moi; seule une classe de filtre fonctionnait.

Ensuite, mettez à jour votre configuration de journalisation en fonction de cette réponse comme ci-dessous:

LOGGING_CONFIG = {
    ...,
    "filters": {"psutil": {"()": "mypackage.util.logging.PsutilFilter"}},
    "handlers": {"console": {..., "filters": ["psutil"]}},
    "formatters": {
        "detailed": {
            "format": "%(asctime)s %(levelname)s %(psutil)s %(process)x:%(threadName)s:%(name)s:%(lineno)d:%(funcName)s: %(message)s"
        }
    },
}

Essayez de consigner quelque chose et consultez un exemple de sortie tel que:

"""logging utiliies."""
import logging

from psutil import cpu_percent, virtual_memory


class PsutilFilter(logging.Filter):
    """psutil logging filter."""

    def filter(self, record: logging.LogRecord) -> bool:
        """Add contextual information about the currently used CPU and virtual memory percentages into the given log record."""
        record.psutil = f"c{cpu_percent():02.0f}m{virtual_memory().percent:02.0f}"  # type: ignore
        return True

Dans le message ci-dessus, c68m51 signifie 68% d'utilisation du processeur et 51% d'utilisation de la mémoire virtuelle.


0 commentaires