logging.info não aparece no console, mas alerta e erro, sim

99

Quando eu registro um evento com logging.info, ele não aparece no terminal Python.

import logging
logging.info('I am info')  # no output

Em contraste, os eventos registrados com logging.warndo aparecem no terminal.

import logging
logging.warn('I am warning')  # outputs "I am warning"

Posso fazer uma alteração no nível do ambiente para logging.infoimprimir no console? Quero evitar fazer alterações em cada arquivo Python.

sonhador
fonte

Respostas:

163

O logger root sempre padroniza para o nível WARNING. Tente ligar

logging.getLogger().setLevel(logging.INFO)

e você deve ficar bem.

Ztyx
fonte
1
Não, você só precisa ligar uma vez. O logger é construído como uma hierarquia com e todos os logs se resumem a um logger raiz . Ao não especificar nenhum argumento para getLogger(), ele retorna o logger root. Contanto que você não modifique os outros loggers, você só precisa modificar o logger root.
Ztyx
18
Você sabe por que o logging.basicConfig (level = logging.INFO) não funciona? Não consigo ver isso claramente na documentação.
Doppelganger
1
@ P1h3r1e3d13 Sim, se você tiver apenas um criador de logs de raiz, provavelmente as melhores práticas.
Ztyx
7
Isso não funciona no Python 3.5:Python 3.5.2 (default, Nov 12 2018, 13:43:14) [GCC 5.4.0 20160609] on linux >>> import logging >>> rootLog = logging.getLogger() >>> rootLog.setLevel(logging.INFO) >>> rootLog.info('all the kings horses') >>> rootLog.warning('all the kings men') all the kings men
Jeff K
6
@jeffk, o mesmo comigo 3.6.8 não imprime mensagens de informação mesmo quando setLevel está configurado para logging.INFO
Robert Lugg
31

Como @ztyx disse que o nível padrão do logger é WARNING. Você deve configurá-lo para um nível inferior

Você pode fazer isso usando logging.basicConfig e definindo o nível do logger :

logging.basicConfig(level=logging.DEBUG)
Vlad Bezden
fonte
8
Estou me perguntando por basicConfig()que não funciona para mim, embora logging.getLogger().setLevel()funcione adequadamente?
Shayan Amani de
17

As soluções acima não funcionaram para mim, mas o código aqui funcionou:

# set up logging to file
logging.basicConfig(level=logging.DEBUG,
                    format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s',
                    datefmt='%m-%d %H:%M',
                    filename='/temp/myapp.log',
                    filemode='w')
# define a Handler which writes INFO messages or higher to the sys.stderr
console = logging.StreamHandler()
console.setLevel(logging.INFO)
# add the handler to the root logger
logging.getLogger('').addHandler(console)

(Omiti partes do código por uma questão de legibilidade)

Orly
fonte
1
Esta é a única coisa que funcionou para mim. Eu tinha uma linha com logging.error("Connection timed out!")e mesmo com level=logging.DEBUGno basicConfig(), não imprimiria no console. Adicionando o manipulador fez, muito obrigado !!
BruceWayne
Lembre-se de que o manipulador que você está usando está desempenhando um papel. Se, por exemplo, seu código tivesse o NullHandler, nada seria impresso, independentemente da alavanca de registro.
George,
O mesmo aqui - se eu omitir o argumento de nível basicConfigou defini-lo acima de INFO, o logger do console nunca registrará nada. Se eu sair basicConfig, posso ligar setLevelpara um registrador o dia todo (e posso ver a mudança de nível ligando getEffectiveLevel), mas ele nunca registrará nada abaixo do WARNINGnível. Não tenho certeza se esse não é o comportamento correto, mas não é o que eu esperava.
Hal