135 votes

Comment configurer la journalisation syslog en python?

Je ne peux pas obtenir ma tête autour de Python logging module. Mes besoins sont très simples: je veux juste de se connecter tout à syslog. Après la lecture de la documentation, je suis venu avec ce simple script de test:

import logging
import logging.handlers

my_logger = logging.getLogger('MyLogger')
my_logger.setLevel(logging.DEBUG)

handler = logging.handlers.SysLogHandler()

my_logger.addHandler(handler)

my_logger.debug('this is debug')
my_logger.critical('this is critical')

Mais ce script ne permet pas de produire des enregistrements de journal dans syslog. Quel est le problème?

153voto

dr jimbob Points 6876

Modifier la ligne:

handler = SysLogHandler(address='/dev/log')

Cela fonctionne pour moi

import logging
import logging.handlers

my_logger = logging.getLogger('MyLogger')
my_logger.setLevel(logging.DEBUG)

handler = logging.handlers.SysLogHandler(address = '/dev/log')

my_logger.addHandler(handler)

my_logger.debug('this is debug')
my_logger.critical('this is critical')

28voto

egrep Points 51

Vous devriez toujours utiliser l'hôte local pour l'enregistrement, si /dev/log ou localhost par la pile TCP. Ceci permet de pleinement conforme à la RFC et plein de fonctionnalités du système de journalisation syslog daemon pour gérer. Ceci élimine le besoin pour la télécommande démon pour être fonctionnel et offre les fonctionnalités améliorées de syslog daemon est comme rsyslog et syslog-ng par exemple. La même philosophie va pour SMTP. Juste la main pour le SMTP local logiciel. Dans ce cas, utilisez "mode programmation" pas le démon, mais c'est la même idée. Laissez le plus capable de logiciels de la gérer. Nouvelle tentative, de files d'attente, local de bobinage, à l'aide de TCP au lieu de UDP pour syslog et ainsi de suite devenu possible. Vous pouvez également [re-]configurer ces démons séparément à partir de votre code comme il se doit.

Enregistrez votre code de votre application, laisser les autres faire le logiciel c'est le travail de concert.

12voto

Oliver Henriot Points 66

J'ajoute un petit commentaire supplémentaire juste au cas où il permet à personne parce que j'ai trouvé cet échange utile, mais nécessaire, ce petit supplément d'info pour obtenir tout cela fonctionne.

Pour vous connecter à un établissement spécifique à l'aide de SysLogHandler vous devez spécifier l'établissement de la valeur. Supposons par exemple que vous avez défini:

local3.* /var/log/mylog

dans syslog, alors vous aurez envie de l'utiliser:

handler = logging.handlers.SysLogHandler(address = ('localhost',514), facility=19)

et vous avez aussi besoin d'avoir de syslog à l'écoute sur UDP à utiliser localhost au lieu de /dev/log.

11voto

bstpierre Points 12616

Est votre syslog.conf gère l'installation, l'utilisateur?

Vous pouvez définir des locaux utilisés par le logger de python avec la facilité d'argument, quelque chose comme ceci:

handler = logging.handlers.SysLogHandler(facility=SysLogHandler.LOG_DAEMON)

7voto

luismartingil Points 101

À partir de https://github.com/luismartingil/per.scripts/tree/master/python_syslog

#!/usr/bin/python
# -*- coding: utf-8 -*-

'''
Implements a new handler for the logging module which uses the pure syslog python module.

@author:  Luis Martin Gil
@year: 2013
'''
import logging
import syslog

class SysLogLibHandler(logging.Handler):
    """A logging handler that emits messages to syslog.syslog."""
    FACILITY = [syslog.LOG_LOCAL0,
                syslog.LOG_LOCAL1,
                syslog.LOG_LOCAL2,
                syslog.LOG_LOCAL3,
                syslog.LOG_LOCAL4,
                syslog.LOG_LOCAL5,
                syslog.LOG_LOCAL6,
                syslog.LOG_LOCAL7]
    def __init__(self, n):
        """ Pre. (0 <= n <= 7) """
        try:
            syslog.openlog(logoption=syslog.LOG_PID, facility=self.FACILITY[n])
        except Exception , err:
            try:
                syslog.openlog(syslog.LOG_PID, self.FACILITY[n])
            except Exception, err:
                try:
                    syslog.openlog('my_ident', syslog.LOG_PID, self.FACILITY[n])
                except:
                    raise
        # We got it
        logging.Handler.__init__(self)

    def emit(self, record):
        syslog.syslog(self.format(record))

if __name__ == '__main__':
    """ Lets play with the log class. """
    # Some variables we need
    _id = 'myproj_v2.0'
    logStr = 'debug'
    logFacilityLocalN = 1

    # Defines a logging level and logging format based on a given string key.
    LOG_ATTR = {'debug': (logging.DEBUG,
                          _id + ' %(levelname)-9s %(name)-15s %(threadName)-14s +%(lineno)-4d %(message)s'),
                'info': (logging.INFO,
                         _id + ' %(levelname)-9s %(message)s'),
                'warning': (logging.WARNING,
                            _id + ' %(levelname)-9s %(message)s'),
                'error': (logging.ERROR,
                          _id + ' %(levelname)-9s %(message)s'),
                'critical': (logging.CRITICAL,
                             _id + ' %(levelname)-9s %(message)s')}
    loglevel, logformat = LOG_ATTR[logStr]

    # Configuring the logger
    logger = logging.getLogger()
    logger.setLevel(loglevel)

    # Clearing previous logs
    logger.handlers = []

    # Setting formaters and adding handlers.
    formatter = logging.Formatter(logformat)
    handlers = []
    handlers.append(SysLogLibHandler(logFacilityLocalN))
    for h in handlers:
        h.setFormatter(formatter)
        logger.addHandler(h)

    # Yep!
    logging.debug('test debug')
    logging.info('test info')
    logging.warning('test warning')
    logging.error('test error')
    logging.critical('test critical')

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X