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.
También puede agregar un controlador de archivo o un manejador de archivo rotativo para enviar sus registros a un archivo local: http://docs.python.org/2/library/logging.handlers.html
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.