Domanda

Voglio unificare l'intera funzione di registrazione della mia app. Qualsiasi avvertimento è un'eccezione, dopo lo prendo e lo passo al logger. Ma la domanda: c'è nel logging qualche funzione di silenziamento? A volte il logger diventa troppo dettagliato. A volte, a causa di avvisi troppo rumorosi, c'è qualche limite dettagliato negli avvisi?

http://docs.python.org/library/logging.html

http://docs.python.org/library/warnings.html

È stato utile?

Soluzione

Non solo ci sono livelli di log , ma esiste un molto flessibile modo di configurarli . Se stai utilizzando oggetti logger (ad es. logger = logging.getLogger (...) ), puoi configurarli in modo appropriato. Ciò consentirà di configurare la verbosità su un sottosistema per sottosistema in cui un sottosistema è definito dalla gerarchia di registrazione.

L'altra opzione è usare logging.Filter e Filtri di avviso per limitare l'output . Non ho mai usato questo metodo prima, ma sembra che potrebbe adattarsi meglio alle tue esigenze.

Dai a PEP-282 una buona descrizione in prosa di il pacchetto Python logging . Penso che descriva la funzionalità molto meglio della documentazione del modulo.

Modifica dopo chiarimento

Potresti essere in grado di gestire la parte di registrazione di questo utilizzando una classe personalizzata basata su logging.Logger e registrato con logging.setLoggerClass () . Sembra davvero che tu voglia qualcosa di simile al " ultimo messaggio di syslog ripetuto 9 volte " . Sfortunatamente non conosco un'implementazione di questo da nessuna parte. Potresti voler vedere se twisted.python.log supporta questa funzionalità.

Altri suggerimenti

dalla fonte che hai menzionato. ci sono i livelli di registro, usa saggiamente ;-)

LEVELS = {'debug': logging.DEBUG,
          'info': logging.INFO,
          'warning': logging.WARNING,
          'error': logging.ERROR,
          'critical': logging.CRITICAL}

Questo sarà un problema se prevedi di effettuare tutte le chiamate di registrazione da un gestore di errori cieco che non sa nulla del codice che ha generato l'errore, che è quello che sembra la tua domanda. Come deciderai quali chiamate di registrazione vengono effettuate e quali no?

La pratica più standard consiste nell'utilizzare tali blocchi per ripristinare, se possibile, e registrare un errore (in realtà, se si tratta di un errore per il quale non si è specificamente preparati, si desidera conoscerlo; utilizzare un livello elevato) . Ma non fare affidamento su questi blocchi per tutte le informazioni sullo stato / debug. Meglio cospargere il codice con la registrazione delle chiamate prima che arrivi al gestore degli errori. In questo modo, è possibile osservare utili informazioni di runtime su un sistema quando NON si guasta e si possono effettuare chiamate di registrazione di diversa gravità. Ad esempio:

import logging
from traceback import format_exc
logger = logging.getLogger() # Gives the root logger.  Change this for better organization
# Add your appenders or what have you
def handle_error(e):
    logger.error("Unexpected error found")
    logger.warn(format_exc()) #put the traceback in the log at lower level
    ... #Your recovery code
def do_stuff():
    logger.info("Program started")
    ... #Your main code
    logger.info("Stuff done")
if __name__ == "__main__":
    try:
        do_stuff()
    except Exception,e:
        handle_error(e)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top