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é?
3 Réponses :
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
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
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')
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.
Que diriez-vous de décorer la fonction de journalisation?