2011-10-19 6 views
10

Cuando ejecuto esto en mi mac:mensajes Syslog aparecen como "Desconocido" cuando uso logging.handlers.SysLogHandler de Python

import logging.handlers 
logger = logging.getLogger(__name__) 
logger.setLevel(logging.DEBUG) 

syslog_address = '/var/run/syslog' 
logger.addHandler(logging.handlers.SysLogHandler(syslog_address)) 
logger.error("What the crap?") 

Se manifiesta así en el syslog:

Oct 18 19:02:06 nick Unknown[4294967295] <Error>: What the crap? 

¿Por qué es desconocido? ¿No debería ser lo suficientemente inteligente como para llamarse a sí mismo después del nombre del script?

Respuesta

5

Para obtener lo que necesita, debe agregar un formateador al controlador para que no tenga que formatear manualmente cada mensaje.

import logging.handlers 
logger = logging.getLogger(__name__) 
logger.setLevel(logging.DEBUG) 

syslog_address = '/var/run/syslog' 

handler = logging.handlers.SysLogHandler(syslog_address) 
# create the formatter 
formatter = logging.Formatter('%(name)s: [%(levelname)s] %(message)s') 
# plug this formatter into your handler(s) 
handler.setFormatter(formatter) 

logger.addHandler(handler) 
logger.error("What the crap?") 

Ahora debe encontrar que se ve en las entradas de syslog como era de esperar:

Jul 4 14:34:40 ip-127-0-0-1 script_name.py: [ERROR] What the crap? 
+2

Parece que la API para controladores difiere entre algunas versiones de Python. Simplemente tuve que hacer lo siguiente para manejar nuestros 2 entornos: try: handler.addFormatter (formateador) excepto AttributeError, e: handler.formatter = formateador – Splee

15

Creo que APP-NAME (que indica la fuente) es un componente opcional en el encabezado del syslog. La última versión de SysLogHandler (para Python 3.3) incluye soporte para APP-NAME (llamado ident según la API C syslog), pero no está disponible en versiones anteriores. Ver this Python issue.

Si antecede el nombre de su script a todos los mensajes, obtendrá el efecto deseado. Por ejemplo,

logger.error('foo: What\'s up?') 

mostrará, p.

19/10/2011 13:51:17 foo [2147483647] ¿Qué pasa?

en el registro.

+0

De acuerdo con el problema de Python, puede establecer la propiedad 'handler.ident' en una cadena y se agregará automáticamente a todos los mensajes. – Hubro

+0

@Hubro cierto, eso es una adición posterior al código de registro: se agregó como resultado del problema vinculado. Esta solución es para versiones anteriores de Python. –

+0

Corrección después de la prueba, no basta con darle a 'handler.ident' el valor' "app_name" ', ya que solo lo antepondrá tal como está, y se termina con una línea de registro como' "nombre_aplicaciónEsta es una prueba" '. Tienes que incluir '": "' manualmente. – Hubro

2

Se puede encontrar toda la lista de qué palabra coincide con lo que en la lista se pueden encontrar en this link

Si necesita más que puede tener una mirada más ejemplo:

from logging.handlers import SysLogHandler 
import logging 

def log(self, severity=logging.DEBUG, message=None): 
    """ 
    Log utility for system wide logging needs 
    @param severity Log severity 
    @param message Log message 
    @return 
    """ 
    logger = logging.getLogger() 
    logger.setLevel(severity) 
    syslog = SysLogHandler(address="/dev/log") 
    syslog.setFormatter(
      logging.Formatter("%(module)s-%(processName)s[%(process)d]: %(name)s: %(message)s") 
    ) 
    logger.addHandler(syslog) 
    logger.log(severity, message) 

Es bastante simple y utilizo este método como un paquete de registro global en mis proyectos.

Cuestiones relacionadas