Em python, por que usar registro em vez de impressão?

96

Para depuração simples em um projeto complexo, há uma razão para usar o logger python em vez de imprimir? E quanto a outros casos de uso? Existe um melhor caso de uso aceito para cada um (especialmente quando você está procurando apenas por stdout)?

Sempre ouvi dizer que essa é uma "prática recomendada", mas não consegui descobrir o porquê.

Sam Odio
fonte
4
Para grandes projetos, o registro é sempre uma "prática recomendada" porque você pode facilmente ligá-lo ou desligá-lo e obter mais ou menos informações. a impressão não oferece nenhuma dessas vantagens.
Chris Eberle
1
Veja, por exemplo, blog.tplus1.com/index.php/2007/09/28/…
agf
3
Eu não acho que há sempre uma melhor caso de uso para print.
SingleNegationElimination
5
A documentação de registro do python diz que o melhor caso de uso para printé exibir mensagens de ajuda para o usuário em um aplicativo de linha de comando.
lamacenta de
Lendo todas essas respostas, quero fazer a pergunta inversa: existe uma razão para não usar o log?
information_interchange

Respostas:

105

O pacote de registro tem muitos recursos úteis:

  • Fácil de ver onde e quando (até mesmo de qual número de linha) uma chamada de registro está sendo feita.
  • Você pode registrar em arquivos, sockets, praticamente qualquer coisa, tudo ao mesmo tempo.
  • Você pode diferenciar seu registro com base na gravidade.

A impressão não tem nenhum desses.

Além disso, se o seu projeto deve ser importado por outras ferramentas Python, é uma prática ruim que o seu pacote imprima coisas no stdout, já que o usuário provavelmente não saberá de onde vêm as mensagens de impressão. Com o registro, os usuários de seu pacote podem escolher se desejam ou não propagar mensagens de registro de sua ferramenta.

Ondrej Slinták
fonte
2
Muito bem dito. Às vezes, usarei o print ao depurar um script descartável que pretendo executar exatamente uma vez, mas qualquer código que já foi visto por outros olhos humanos ou que deve durar mais de um dia fica logger.
TimothyAWiseman
23

Uma das maiores vantagens do registro adequado é que você pode categorizar as mensagens e ativá-las ou desativá-las, dependendo do que for necessário. Por exemplo, pode ser útil ativar as mensagens de nível de depuração para uma determinada parte do projeto, mas diminuí-las para outras partes, de modo a não ser assumido pela sobrecarga de informações e se concentrar facilmente na tarefa para a qual você precisa exploração madeireira.

Além disso, os logs são configuráveis. Você pode facilmente filtrá-los, enviá-los para arquivos, formatá-los, adicionar carimbos de data / hora e qualquer outra coisa que você possa precisar em uma base global. As declarações de impressão não são facilmente gerenciadas.

livrar
fonte
3
Definitivamente, +1 para enviar saída para arquivos. Analisar um arquivo de log no post-mortem é muito melhor do que quebrá-lo novamente em uma janela de console aberta para encontrar o erro. Basicamente, um logger é ideal para qualquer momento em que você precisar depurar o script depois que ele falhou, e não enquanto ele está falhando. Também é ideal para quando você precisar depurar um problema complexo que exija a análise da saída do programa. Basicamente, sempre que você estiver lidando com erros mais complexos do que erros de sintaxe, um logger provavelmente simplificará isso para você.
Jonathanb
11

As declarações impressas são o pior dos dois mundos , combinando os aspectos negativos de um depurador online com instrumentação de diagnóstico. Você tem que modificar o programa, mas não obtém mais códigos úteis dele.

Um depurador online permite que você inspecione o estado de um programa em execução; Mas o bom de um depurador real é que você não precisa modificar o código-fonte; nem antes nem depois da sessão de depuração; Você apenas carrega o programa no depurador, diz ao depurador onde deseja olhar e está tudo pronto.

Instrumentar o aplicativo pode exigir algum trabalho inicial, modificar o código-fonte de alguma forma, mas a saída de diagnóstico resultante pode ter uma quantidade enorme de detalhes e pode ser ativada ou desativada em um grau muito específico. O módulo de registro do python pode mostrar não apenas a mensagem registrada, mas também o arquivo e a função que a chamou, um rastreamento, se houver, a hora real em que a mensagem foi emitida e assim por diante. Mais que isso; necessidade de instrumentação de diagnóstico nunca ser removida; É tão válido e útil quando o programa está concluído e em produção quanto no dia em que foi adicionado; mas pode ter sua saída presa em um arquivo de log, onde provavelmente não incomodará ninguém, ou o nível de log pode ser reduzido para manter todas as mensagens, exceto as mais urgentes.

prever a necessidade ou o uso de um depurador não é realmente mais difícil do que usar ipython durante o teste e se familiarizar com os comandos que ele usa para controlar o depurador pdb embutido.

Quando você se pegar pensando que uma instrução de impressão pode ser mais fácil do que usar pdb (como costuma ser), você descobrirá que usar um logger torna seu programa muito mais fácil de trabalhar do que se você usar e remover posteriormente as instruções de impressão .

Tenho meu editor configurado para destacar as instruções de impressão como erros de sintaxe e as instruções de registro como comentários, uma vez que é assim que as vejo.

SingleNegationElimination
fonte
4

Se você usar o log, a pessoa responsável pela implantação pode configurar o logger para enviá-lo a um local personalizado, com informações personalizadas. Se você apenas imprimir, isso é tudo que eles terão.

Ignacio Vazquez-Abrams
fonte
1

O registro basicamente cria um banco de dados de texto simples pesquisável de saídas de impressão com outros metadados (carimbo de data / hora, nível de log, número de linha, processo, etc.).

Isso é ouro puro, posso executar egrep sobre o arquivo de log após a execução do script python. Posso ajustar minha pesquisa de padrão egrep para escolher exatamente o que estou interessado e ignorar o resto. Essa redução da carga cognitiva e da liberdade de escolher meu padrão egrep mais tarde por tentativa e erro é o principal benefício para mim.

tail -f mylogfile.log | egrep "key_word1|key_word2"

Agora acrescente outras coisas legais que o print não pode fazer (enviar para o socket, definir níveis de depuração, logrotate, adicionar metadados, etc.), você tem todos os motivos para preferir o registro em vez das instruções de impressão simples.

Eu tendo a usar instruções de impressão porque é preguiçoso e fácil, adicionar log requer algum código padrão, ei, nós temos yasnippets (emacs) e ultisnips (vim) e outras ferramentas de modelagem, então por que desistir de log para instruções de impressão simples !?

tiquetaque
fonte