rotatingfilehandler multiple log files example python logging syslog

multiple - ¿Cómo configurar el registro en syslog en Python?



python logging rotatingfilehandler example (10)

No entiendo bien el módulo de logging de Python. Mis necesidades son muy simples: solo quiero registrar todo en syslog. Después de leer la documentación, se me ocurrió este sencillo script de prueba:

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'')

Pero este script no produce ningún registro de registro en syslog. ¿Qué pasa?


¿Está configurado syslog.conf para manejar facility = user?

Puede configurar la facilidad utilizada por el registrador de Python con el argumento de instalación, algo como esto:

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


Agrego un pequeño comentario adicional en caso de que ayude a alguien porque este intercambio me resultó útil pero necesitaba esta pequeña información adicional para que todo funcione.

Para iniciar sesión en una instalación específica con SysLogHandler, debe especificar el valor de la instalación. Diga por ejemplo que ha definido:

local3.* /var/log/mylog

en syslog, entonces querrás usar:

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

y también necesita tener syslog escuchando en UDP para usar localhost en lugar de / dev / log.


Cambia la línea a esto:

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

Esto funciona para mí

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'')


Desde 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'')


Encontré el módulo syslog para que sea bastante fácil obtener el comportamiento de registro básico que describes:

import syslog syslog.syslog("This is a test message") syslog.syslog(syslog.LOG_INFO, "Test message at INFO priority")

Hay otras cosas que podrías hacer, también, pero incluso las dos primeras líneas de eso te darán lo que pediste tal como yo lo entiendo.


Este es el método yaml dictConfig recomendado para 3.2 y posteriores.

En log cfg.yml :

version: 1 disable_existing_loggers: true formatters: default: format: "[%(process)d] %(name)s(%(funcName)s:%(lineno)s) - %(levelname)s: %(message)s" handlers: syslog: class: logging.handlers.SysLogHandler level: DEBUG formatter: default address: /dev/log facility: local0 rotating_file: class: logging.handlers.RotatingFileHandler level: DEBUG formatter: default filename: rotating.log maxBytes: 10485760 # 10MB backupCount: 20 encoding: utf8 root: level: DEBUG handlers: [syslog, rotating_file] propogate: yes loggers: main: level: DEBUG handlers: [syslog, rotating_file] propogate: yes

Carga la configuración usando:

log_config = yaml.safe_load(open(''cfg.yml'')) logging.config.dictConfig(log_config)

Configurado tanto syslog como un archivo directo. Tenga en cuenta que /dev/log es específico del sistema operativo.


Reuniendo cosas de aquí y de otros lugares, esto es lo que se me ocurrió que funciona en unbuntu 12.04 y centOS6

Cree un archivo en /etc/rsyslog.d/ que termine en .conf y agregue el siguiente texto

local6.* /var/log/my-logfile

Reinicie rsyslog , la recarga NO parece funcionar para los nuevos archivos de registro. ¿Tal vez solo recarga los archivos conf existentes?

sudo restart rsyslog

Luego puede usar este programa de prueba para asegurarse de que realmente funcione.

import logging, sys from logging import config LOGGING = { ''version'': 1, ''disable_existing_loggers'': False, ''formatters'': { ''verbose'': { ''format'': ''%(levelname)s %(module)s P%(process)d T%(thread)d %(message)s'' }, }, ''handlers'': { ''stdout'': { ''class'': ''logging.StreamHandler'', ''stream'': sys.stdout, ''formatter'': ''verbose'', }, ''sys-logger6'': { ''class'': ''logging.handlers.SysLogHandler'', ''address'': ''/dev/log'', ''facility'': "local6", ''formatter'': ''verbose'', }, }, ''loggers'': { ''my-logger'': { ''handlers'': [''sys-logger6'',''stdout''], ''level'': logging.DEBUG, ''propagate'': True, }, } } config.dictConfig(LOGGING) logger = logging.getLogger("my-logger") logger.debug("Debug") logger.info("Info") logger.warn("Warn") logger.error("Error") logger.critical("Critical")


Siempre debe usar el host local para el registro, ya sea a / dev / log o localhost a través de la pila TCP. Esto permite que el daemon de inicio de sesión completo y compatible con RFC maneje syslog. Esto elimina la necesidad de que el daemon remoto sea funcional y proporciona las capacidades mejoradas de los daemon syslog como rsyslog y syslog-ng, por ejemplo. La misma filosofía es para SMTP. Solo entrégalo al software SMTP local. En este caso, use ''modo programa'' no el daemon, pero es la misma idea. Permita que el software más capaz lo maneje. Es posible volver a intentar, hacer cola, spooling local, usar TCP en lugar de UDP para syslog y demás. También puede [volver] configurar esos demonios por separado de su código como debería ser.

Guarde su codificación para su aplicación, permita que otro software haga su trabajo en concierto.



import syslog syslog.openlog(ident="LOG_IDENTIFIER",logoption=syslog.LOG_PID, facility=syslog.LOG_LOCAL0) syslog.syslog(''Log processing initiated...'')

la secuencia de comandos anterior se registrará en la instalación LOCAL0 con nuestro "IDENTIFICADOR_INDICADOR" personalizado ... puede usar LOCAL [0-7] para fines locales.