2011-10-19 9 views
10

Quando eseguo questo sul mio Mac:messaggi Syslog visualizzati come "Sconosciuto" quando uso logging.handlers.SysLogHandler di 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?") 

Si presenta come questo nel syslog:

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

Perché è sconosciuto? Non dovrebbe essere abbastanza intelligente nominarsi dopo il nome dello script ?

risposta

5

Per ottenere ciò che è necessario, è necessario aggiungere un formattatore al gestore in modo che non sia necessario formattare manualmente tutti i messaggi manualmente.

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?") 

Ora si dovrebbe trovare che si vedono le voci nel syslog come ci si aspetterebbe:

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

Sembra che l'API per i gestori differisca tra alcune versioni di Python. Ho solo dovuto eseguire quanto segue per gestire i nostri 2 ambienti: provare: handler.addFormatter (formatter) tranne AttributeError, e: handler.formatter = formatter – Splee

15

Penso che l'APP-NAME (che indica l'origine) sia un componente opzionale nell'intestazione di syslog. L'ultima versione di SysLogHandler (per Python 3.3) include il supporto per un APP-NAME (chiamato ident come per l'API C syslog), ma non è disponibile nelle versioni precedenti. Vedi this Python issue.

Se si antepone il nome dello script a tutti i messaggi, si otterrà l'effetto desiderato. Ad esempio,

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

verrà visualizzato ad es.

19/10/2011 13:51:17 foo [2147483647] Che succede?

nel registro.

+0

In base al problema Python è possibile impostare la proprietà 'handler.ident' su una stringa e verrà automaticamente anteposta a tutti i messaggi. – Hubro

+0

@Hubro true, si tratta di un'aggiunta successiva al codice di registrazione, aggiunta come risultato del problema collegato. Questa soluzione è per le versioni precedenti di Python. –

+0

Correzione dopo il test, non è sufficiente dare a 'handler.ident' il valore' "app_name" ', dato che sarà anteposto come è, e si finisce con una riga di log come' "app_nameThis is a test" '. Devi includere '": "' manualmente. – Hubro

2

Si può trovare tutta la lista quale parola corrisponde a ciò che nella lista si possono trovare presso this link

Se avete bisogno di più si può avere uno sguardo ulteriore esempio:

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) 

È piuttosto semplice e utilizzo questo metodo come pacchetto di registrazione globale nei miei progetti.

Problemi correlati