python et les syslog ou log

Syslog

pour windows

https://sourceforge.net/projects/pywin32/

import win32evtlogutil
win32evtlogutil.ReportEvent('NameAppli', 2, eventType=1, strings=['alert','coucou2'])
win32evtlogutil.ReportEvent('NameAppli', 2, eventType=3, strings=['info','coucou2'])

pour linux

import syslog
syslog.syslog('Processing started')
if error:
    syslog.syslog(syslog.LOG_ERR, 'Processing started')

ou avec plus d’option

syslog.openlog(logopt=syslog.LOG_PID, facility=syslog.LOG_MAIL)
syslog.syslog('E-mail processing initiated...')
Priority levels (high to low):
LOG_EMERG, LOG_ALERT, LOG_CRIT, LOG_ERR, LOG_WARNING, LOG_NOTICE, LOG_INFO, LOG_DEBUG.
Facilities:
LOG_KERN, LOG_USER, LOG_MAIL, LOG_DAEMON, LOG_AUTH, LOG_LPR, LOG_NEWS, LOG_UUCP, LOG_CRON and LOG_LOCAL0 to LOG_LOCAL7.
Log options:
LOG_PID, LOG_CONS, LOG_NDELAY, LOG_NOWAIT and LOG_PERROR if defined in <syslog.h>.

log fichier

import os, platform
import logging
if platform.platform().startswith('Windows'):
    logging_file = os.path.join(os.getenv('HOMEDRIVE'), os.getenv('HOMEPATH'), 'test.log')
else:
    logging_file = os.path.join(os.getenv('HOME'), 'test.log')
print("Logging to", logging_file)

logging.basicConfig(level=logging.DEBUG,
    format='%(asctime)s : %(levelname)s - %(name)s - %(module)s \ %(funcName)s : %(message)s',
    filename = logging_file,
    filemode = 'w',
)
logging.debug("Start of the program")
logging.info("Doing something")
logging.warning("Dying now")

Il existe les niveaux DEBUG, INFO, WARNING, ERROR et CRITICAL (fonction debug(), info(), warning(), error() and critical() )

Il existe plusieurs méthodes pour se connecter aux loggers (il peut y en avoir plusieurs en même temps): fichier, console, réseau; la configuration du logger est utilisable dans un module mais sera propager sur les autres modules ou classes appelées. Il existe au niveau du formatage de nombreuses options (cf doc)

On peut aussi ajouter des paramètres qui permettent d’avoir des logs tournantes

import glob
import logging
import logging.handlers

LOG_FILENAME = 'logging_rotatingfile_example.out'

# Set up a specific logger with our desired output level
my_logger = logging.getLogger('MyLogger')
my_logger.setLevel(logging.DEBUG)

# Add the log message handler to the logger
handler = logging.handlers.RotatingFileHandler(
              LOG_FILENAME, maxBytes=20, backupCount=5)

my_logger.addHandler(handler)

ici on aura 5 fichiers tournant

un autre exemple avec gestion du niveau de log souhaité

import logging

# create logger
logger = logging.getLogger("simple_example")
logger.setLevel(logging.DEBUG)

# create console handler and set level to debug
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)

# create formatter
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")

# add formatter to ch
ch.setFormatter(formatter)

# add ch to logger
logger.addHandler(ch)

# "application" code
logger.debug("debug message")
logger.info("info message")
logger.warn("warn message")
logger.error("error message")
logger.critical("critical message")
LEVEL_DEBUG = {'DEBUG':logging.DEBUG,
                'INFO' : logging.INFO,
                'WARNING' : logging.WARNING,
                'ERROR' : logging.ERROR,
                'CRITICAL' : logging.CRITICAL}

Note

il existe des handlers qui permettent d’envoyer les messages à travers le réseau a un même logger on peut attacher plusieurs handler (une sortie console + une sortie fichier, ...)