Exploração madeireira
O Python já possui um excelente módulo de log embutido . Você pode usar o modelo de log aqui .
O módulo de registro permite especificar um nível de importância; durante a depuração, você pode registrar tudo, enquanto durante a operação normal, você pode registrar apenas coisas críticas. Você pode desligar e ligar as coisas.
A maioria das pessoas usa apenas instruções básicas de impressão para depurar e remove as instruções de impressão. É melhor deixá-los dentro, mas desativá-los; então, quando você tiver outro bug, basta reativar tudo e examinar seus logs.
Essa pode ser a melhor maneira possível de depurar programas que precisam fazer as coisas rapidamente, como programas de rede que precisam responder antes que a outra extremidade da conexão expire e desapareça. Você pode não ter muito tempo para executar uma etapa em um depurador; mas você pode simplesmente deixar seu código rodar e registrar tudo, depois examinar os logs e descobrir o que realmente está acontecendo.
EDIT: O URL original dos modelos era: http://aymanh.com/python-debugging-techniques
Como esta página está ausente, substituí-a por uma referência ao instantâneo salvo em archive.org: http://web.archive.org/web/20120819135307/http://aymanh.com/python-debugging-techniques
Caso desapareça novamente, aqui estão os modelos que mencionei. Este é um código retirado do blog; Eu não escrevi.
import logging
import optparse
LOGGING_LEVELS = {'critical': logging.CRITICAL,
'error': logging.ERROR,
'warning': logging.WARNING,
'info': logging.INFO,
'debug': logging.DEBUG}
def main():
parser = optparse.OptionParser()
parser.add_option('-l', '--logging-level', help='Logging level')
parser.add_option('-f', '--logging-file', help='Logging file name')
(options, args) = parser.parse_args()
logging_level = LOGGING_LEVELS.get(options.logging_level, logging.NOTSET)
logging.basicConfig(level=logging_level, filename=options.logging_file,
format='%(asctime)s %(levelname)s: %(message)s',
datefmt='%Y-%m-%d %H:%M:%S')
# Your program goes here.
# You can access command-line arguments using the args variable.
if __name__ == '__main__':
main()
E aqui está sua explicação de como usar o descrito acima. Novamente, não recebo o crédito por isso:
Por padrão, o módulo de registro imprime mensagens críticas, de erro e de aviso. Para alterar isso para que todos os níveis sejam impressos, use:
$ ./your-program.py --logging=debug
Para enviar mensagens de log para um arquivo chamado debug.log, use:
$ ./your-program.py --logging-level=debug --logging-file=debug.log