Estou usando o módulo de log do Python e quero desativar o log do console por algum tempo, mas ele não funciona.
#!/usr/bin/python
import logging
logger = logging.getLogger() # this gets the root logger
# ... here I add my own handlers
#logger.removeHandler(sys.stdout)
#logger.removeHandler(sys.stderr)
print logger.handlers
# this will print [<logging.StreamHandler instance at ...>]
# but I may have other handlers there that I want to keep
logger.debug("bla bla")
O código acima exibe o bla bla
on stdout e não sei como posso desativar com segurança o manipulador do console. Como posso ter certeza de remover temporariamente o StreamHandler do console e não outro?
logger.handlers
ela deverá estar vazia (pois precede alogger.debug()
chamada). O código em questão é exibido apenas[]
(lista vazia de manipuladores). Verificado com Python 2.7.15 e Python 3.6.6.Respostas:
Encontrei uma solução para isso:
Isso impedirá que o log seja enviado ao logger superior que inclui o log do console.
fonte
INFO
mensagens), você pode mudar a segunda linha para algo comologger.setLevel(logging.WARNING)
logging.lastResort
manipulador ainda registrará mensagens de severidadelogging.WARNING
e maioressys.stderr
na ausência de outros manipuladores. Veja minha resposta .Eu uso:
fonte
logging
nível do módulo para desativar completamente o registro , por exemploimport logging; logging.disable(logging.CRITICAL);
:: docs.python.org/2/library/logging.html#logging.disabledisabled
atributo não faz parte da API pública. Veja bugs.python.org/issue36318 .Você pode usar:
onde your_level é um deles:
Portanto, se você definir seu_level como log.CRITICAL , receberá apenas mensagens críticas enviadas por:
Configurando seu_level para o log.DEBUG mostrará todos os níveis de log.
Para mais detalhes, consulte exemplos de registro.
Da mesma maneira para alterar o nível de cada manipulador, use a função Handler.setLevel () .
fonte
(pergunta há muito morta, mas para futuros pesquisadores)
Mais próximo do código / intenção do pôster original, isso funciona para mim no python 2.6
O problema que tive que resolver foi remover o manipulador stdout após adicionar um novo; o código do criador de logs parece adicionar novamente o stdout automaticamente se nenhum manipulador estiver presente.
fonte
logger = logging.getLogger(); lhStdout = logger.handlers[0]
está incorreta, pois o registrador raiz inicialmente não possui manipuladores -python -c "import logging; assert not logging.getLogger().handlers"
. Verificado com Python 2.7.15 e Python 3.6.6.Gerenciador de contexto
Exemplo de uso:
fonte
Para desativar totalmente o log :
Para habilitar o log :
Outras respostas fornecem soluções alternativas que não resolvem completamente o problema, como
e, para alguns
n
superiores a 50,O problema com a primeira solução é que ele funciona apenas para o registrador raiz. Outros criadores de logs criados usando, por exemplo,
logging.getLogger(__name__)
não são desativados por esse método.A segunda solução afeta todos os logs. Mas limita a saída a níveis acima do fornecido, para que você possa substituí-la registrando-se em um nível superior a 50.
Isso pode ser evitado por
que até onde eu sei (depois de revisar a fonte ) é a única maneira de desativar completamente o log.
fonte
Existem algumas respostas muito legais aqui, mas aparentemente a mais simples não é levada muito em consideração (apenas a partir do infinito).
Isso desativa o registrador raiz e, portanto, todos os outros registradores. Eu realmente não testei, mas também deve ser o mais rápido.
No código de log do python 2.7, vejo isso
O que significa que, quando desabilitado, nenhum manipulador é chamado e deve ser mais eficiente filtrar para um valor muito alto ou definir um manipulador não operacional, por exemplo.
fonte
log = logging.getLogger(__name__)
disabled
atributo não faz parte da API pública. Veja bugs.python.org/issue36318 .Não há necessidade de desviar o desvio padrão. Aqui está a melhor maneira de fazer isso:
Uma maneira ainda mais simples é:
fonte
logging.basicConfig()
função (ênfase minha): Faz a configuração básica do sistema de log criando um StreamHandler com um Formatador padrão e adicionando-o ao registrador raiz. As funções debug (), info (), warning (), error () e critical () chamarão basicConfig () automaticamente se nenhum manipulador estiver definido para o registrador raiz . - docs.python.org/3/library/logging.html#logging.basicConfigNão conheço o módulo de registro muito bem, mas estou usando-o da maneira que geralmente quero desativar apenas as mensagens de depuração (ou informações). Você pode usar
Handler.setLevel()
para definir o nível de log como CRÍTICO ou superior.Além disso, você pode substituir sys.stderr e sys.stdout por um arquivo aberto para gravação. Consulte http://docs.python.org/library/sys.html#sys. stdout . Mas eu não recomendaria isso.
fonte
[]
.Você também pode:
fonte
app.logger
que você nem especifica em vez do registrador raiz mencionado explicitamente na pergunta (logging.getLogger()
) e na maioria das respostas? Como você sabe que pode modificar ahandlers
propriedade com segurança em vez de chamar oLogger.addHandler
método?Saída do console:
conteúdo do arquivo test.log:
fonte
Alterando um nível no "logging.config.dictConfig", você poderá levar todo o nível de log para um novo nível.
})
fonte
Encontrou uma solução elegante usando decoradores , que soluciona o seguinte problema: e se você estiver escrevendo um módulo com várias funções, cada uma com várias mensagens de depuração, e quiser desativar o log de todas as funções, exceto aquela em que está focando atualmente?
Você pode fazer isso usando decoradores:
Então, você pode fazer:
Mesmo se você ligar
function_already_debugged
de dentrofunction_being_focused
, as mensagens de depuração defunction_already_debugged
não serão exibidas. Isso garante que você verá apenas as mensagens de depuração da função em que está se concentrando.Espero que ajude!
fonte
Se você deseja desativar temporariamente um certo criador de logs, aqui está o que foi feito.
Exemplo de log
Código
fonte
Na biblioteca Logging Python, é possível desativar completamente o log (para todos os níveis) de um logger específico, executando um dos seguintes procedimentos:
Incluindo no criador de logs um
logging.NullHandler()
manipulador (para impedir que ologging.lastResort
manipulador registre eventos de gravidadelogging.WARNING
e maiores quesys.stderr
) e configurando opropagate
atributo desse criador de logs paraFalse
(para impedir que o criador de logs passe os eventos para os manipuladores dos criadores de logs ancestrais).Usando a API principal:
Usando a API de configuração:
Adicionando ao criador de logs um
lambda record: False
filtro.Usando a API principal:
Usando a API de configuração:
Aviso. - Ao contrário da 1ª solução, a 2ª solução não desabilita o log de registradores filhos (por exemplo
logging.getLogger("foo.bar")
), portanto, deve-se usá-lo apenas para desativar o log de um único logger.Nota. - Definir o
disabled
atributo do criador de logs comoTrue
não é uma terceira solução, pois não faz parte da API pública. Consulte https://bugs.python.org/issue36318 :fonte
subclasse o manipulador que você deseja desativar temporariamente:
encontrar o manipulador pelo nome é bastante fácil:
uma vez encontrado:
fonte