logging.handlers — Manipuladores de logging¶
Código-fonte: Lib/logging/handlers.py
Os seguintes tratadores úteis são fornecidos neste pacote. Observe que três dos tratadores (StreamHandler, FileHandler e NullHandler) são, na verdade, definidos no próprio módulo logging, mas foram documentados aqui junto com os outros tratadores.
StreamHandler¶
A classe StreamHandler localizada no pacote principal logging, envia a saída de log para fluxos como sys.stdout, sys.stderr ou qualquer objeto arquivo ou similar (ou, mais precisamente, qualquer objeto que provê os métodos write() e flush()).
- class logging.StreamHandler(stream=None)¶
Retorna uma nova instância da classe
StreamHandlerSe stream for especificado, a instância irá utilizá-lo para a saída de log; caso contrário, sys.stderr será usado.- emit(record)¶
Se um formatador for especificado, ele será usado para formatar o registro. Em seguida, o registro é escrito no fluxo, seguido por
terminatorSe houver informações de exceção, elas são formatadas usandotraceback.print_exception()e anexadas ao fluxo.
- flush()¶
Esvazia o fluxo chamando seu método
flush(). Observe que o métodoclose()é herdado deHandlere, portanto, não produz nenhuma saída, de modo que uma chamada explícita aflush()pode ser necessária em alguns casos.
- setStream(stream)¶
Define o fluxo da instância para o valor especificado, caso seja diferente. O fluxo antigo é esvaziado antes que o novo fluxo seja definido.
- Parâmetros:
stream – O fluxo que o manipulador deve usar.
- Retorna:
o fluxo antigo, se o fluxo tiver sido alterado, ou
None, se não tiver sido.
Adicionado na versão 3.7.
- terminator¶
String usada como terminador ao gravar um registro formatado em um fluxo. O valor padrão é
'\n'.Se você não quiser uma terminação com nova linha, pode definir o atributo
terminatorda instância do manipulador como uma string vazia.Nas versões anteriores, o terminador era codificado diretamente como
'\n'.Adicionado na versão 3.2.
FileHandler¶
A classe FileHandler, localizada no pacote principal logging, envia a saída de logging para um arquivo em disco. Ela herda a funcionalidade de saída da classe StreamHandler.
- class logging.FileHandler(filename, mode='a', encoding=None, delay=False, errors=None)¶
Retorna uma nova instância da classe
FileHandler. O arquivo especificado é aberto e usado como o fluxo para logging. Se mode não for especificado,'a'é usado. Se encoding não forNone, ele é usado para abrir o arquivo com essa codificação. Se delay for verdadeiro, então a abertura do arquivo é adiada até a primeira chamada deemit()Por padrão, o arquivo cresce indefinidamente. Se errors for especificado, ele é usado para determinar como os erros de codificação serão tratados.Alterado na versão 3.6: Além de valores do tipo string, objetos
Pathtambém são aceitos para o argumento filename.Alterado na versão 3.9: O parâmetro errors foi adicionado.
- close()¶
Fecha o arquivo.
NullHandler¶
Adicionado na versão 3.1.
A classe NullHandler, localizada no pacote principal logging, não realiza qualquer formatação ou saída. Ela é essencialmente um manipulador ‘no-op’, destinado ao uso por desenvolvedores de bibliotecas.
- class logging.NullHandler¶
Retorna uma nova instância da classe
NullHandler.- emit(record)¶
Esse método não faz nada.
- handle(record)¶
Esse método não faz nada.
- createLock()¶
Este método retorna
Nonepara a trava, pois não há E/S subjacente cujo acesso precise ser serializado.
Consulte Configurando logging para uma biblioteca para obter mais informações sobre como usar NullHandler.
WatchedFileHandler¶
A classe WatchedFileHandler, localizada no módulo logging.handlers, é um FileHandler que monitora o arquivo no qual está registrando logs. Se o arquivo for alterado, ele é fechado e reaberto usando o nome do arquivo.
Uma alteração no arquivo pode ocorrer devido ao modo de usar de programas como newsyslog e logrotate, que realizam a rotação de arquivos de log. Este manipulador, destinado ao uso em Unix/Linux, monitora o arquivo para verificar se ele foi alterado desde a última chamada a emit. (Considera-se que um arquivo foi alterado se o seu dispositivo ou nó-i tiverem mudado.) Se o arquivo tiver sido alterado, o fluxo do arquivo antigo é fechado, e o arquivo é aberto novamente para obter um novo fluxo.
Este manipulador não é apropriado para uso no Windows, porque, nesse sistema, arquivos de log abertos não podem ser movidos ou renomeados — o logging abre os arquivos com travas exclusivas — e, portanto, não há necessidade desse tipo de manipulador. Além disso, ST_INO não é suportado no Windows; stat() sempre retorna zero para esse valor.
- class logging.handlers.WatchedFileHandler(filename, mode='a', encoding=None, delay=False, errors=None)¶
Retorna uma nova instância da classe
WatchedFileHandler. O arquivo especificado é aberto e usado como o fluxo para registro de logs. Se mode não for especificado,'a'será usado. Se encoding não forNone, ele será usado para abrir o arquivo com essa codificação. Se delay for verdadeiro, a abertura do arquivo é adiada até a primeira chamada aemit(). Por padrão, o arquivo cresce indefinidamente. Se errors for fornecido, ele determina como erros de codificação são tratados.Alterado na versão 3.6: Além de valores do tipo string, objetos
Pathtambém são aceitos para o argumento filename.Alterado na versão 3.9: O parâmetro errors foi adicionado.
- reopenIfNeeded()¶
Verifica se o arquivo foi alterado. Se tiver sido, o fluxo existente é descarregado e fechado, e o arquivo é aberto novamente, normalmente como um passo preliminar antes de enviar o registro para o arquivo.
Adicionado na versão 3.6.
- emit(record)¶
Emite o registro para o arquivo, mas antes chama
reopenIfNeeded()para reabrir o arquivo caso ele tenha sido alterado.
BaseRotatingHandler¶
A classe BaseRotatingHandler, localizada no módulo logging.handlers, é a classe base para os tratadores de arquivos com rotação, RotatingFileHandler e TimedRotatingFileHandler Em geral, não é necessário instanciar essa classe, mas ela possui atributos e métodos que podem precisar ser substituídos.
- class logging.handlers.BaseRotatingHandler(filename, mode, encoding=None, delay=False, errors=None)¶
Os parâmetros são os mesmos de
FileHandler. Os atributos são:- namer¶
Se esse atributo for definido como um chamável, o método
rotation_filename()delega a ele. Os parâmetros passados ao chamável são os mesmos passados pararotation_filename().Nota
A função namer é chamada muitas vezes durante a rotação, portanto deve ser a mais simples e rápida possível. Ela também deve retornar sempre o mesmo resultado para uma dada entrada; caso contrário, o comportamento da rotação pode não funcionar como esperado.
Também vale observar que é preciso ter cuidado ao usar um namer para preservar certos atributo no nome do arquivo que são usados durante a rotação. Por exemplo,
RotatingFileHandlerespera ter um conjunto de arquivos de log cujos nomes contenham inteiros sucessivos, para que a rotação funcione como esperado, eTimedRotatingFileHandlerremova arquivos de log antigos (com base no parâmetrobackupCountpassado ao inicializador do manipulador) determinando quais são os arquivos mais antigos a serem excluídos. Para que isso funcione, os nomes dos arquivos devem ser ordenáveis usando a porção de data/hora do nome, e um namer precisa respeitar isso. (Se for desejado um namer que não respeite esse esquema, ele deverá ser usado em uma subclasse deTimedRotatingFileHandlerque substitua o métodogetFilesToDelete()para se adequar ao esquema de nomeação personalizado.)Adicionado na versão 3.3.
- rotator¶
Se este atributo estiver definido como um chamável, o método
rotate()delega a esse chamável. Os parâmetros passados ao chamável são os mesmos passados pararotate().Adicionado na versão 3.3.
- rotation_filename(default_name)¶
Modifica o nome do arquivo de log durante a rotação.
Isso é fornecido para que um nome de arquivo personalizado possa ser providenciado.
A implementação padrão chama o atributo namer do manipulador, se ele for chamável, passando o nome padrão para ele. Se o atributo não for chamável (o padrão é
None), o nome é devolvido sem alterações.- Parâmetros:
default_name – O nome padrão para o arquivo de log.
Adicionado na versão 3.3.
- rotate(source, dest)¶
Quando ocorre a rotação, rotaciona o log atual.
A implementação padrão chama o atributo rotator do manipulador, se ele for chamável, passando os argumentos source e dest para ele. Se o atributo não for chamável (o padrão é
None), o arquivo de origem é simplesmente renomeado para o destino.- Parâmetros:
source – O nome do arquivo de origem. Normalmente, este é o nome base do arquivo, por exemplo, ‘test.log’.
dest – O nome do arquivo de destino. Normalmente, é para onde o arquivo de origem é rotacionado, por exemplo, ‘test.log.1’.
Adicionado na versão 3.3.
O motivo da existência desses atributos é evitar que você precise criar subclasses — é possível usar os mesmos chamáveis para instâncias de RotatingFileHandler e TimedRotatingFileHandler. Se o chamável namer ou rotator levantar uma exceção, ela será tratada da mesma forma que qualquer outra exceção durante uma chamada a emit(), isto é, por meio do método handleError() do manipulador.
Se precisar fazer alterações mais significativas no processamento de rotação, você pode substituir os métodos.
Para um exemplo, consulte Using a rotator and namer to customize log rotation processing.
RotatingFileHandler¶
A classe RotatingFileHandler, localizada no módulo logging.handlers, oferece suporte à rotação de arquivos de log em disco.
- class logging.handlers.RotatingFileHandler(filename, mode='a', maxBytes=0, backupCount=0, encoding=None, delay=False, errors=None)¶
Retorna uma nova instância da classe
RotatingFileHandler. O arquivo especificado é aberto e usado como o stream para logging. Se mode não for especificado,'a'é usado. Se encoding não forNone, ele é usado para abrir o arquivo com essa codificação. Se delay for verdadeiro, a abertura do arquivo é adiada até a primeira chamada aemit(). Por padrão, o arquivo cresce indefinidamente. Se errors for fornecido, ele é usado para determinar como erros de codificação são tratados.Você pode usar os valores maxBytes e backupCount para permitir que o arquivo faça rollover em um tamanho predeterminado. Quando o tamanho está prestes a ser excedido, o arquivo é fechado e um novo arquivo é aberto silenciosamente para saída. A rotação ocorre sempre que o arquivo de log atual está próximo de maxBytes em comprimento; mas, se maxBytes ou backupCount for zero, a rotação nunca ocorre, portanto, em geral, você deve definir backupCount como pelo menos 1 e usar um maxBytes diferente de zero. Quando backupCount é diferente de zero, o sistema salva arquivos de log antigos acrescentando as extensões ‘.1’, ‘.2’ etc. ao nome do arquivo. Por exemplo, com um backupCount de 5 e um nome de arquivo base
app.log, você teráapp.log,app.log.1,app.log.2, atéapp.log.5. O arquivo no qual se escreve é sempreapp.log. Quando esse arquivo é preenchido, ele é fechado e renomeado paraapp.log.1e, se existirem os arquivosapp.log.1,app.log.2etc., eles são renomeados paraapp.log.2,app.log.3etc., respectivamente.Alterado na versão 3.6: Além de valores do tipo string, objetos
Pathtambém são aceitos para o argumento filename.Alterado na versão 3.9: O parâmetro errors foi adicionado.
- doRollover()¶
Realiza uma rotação, conforme descrito acima.
- emit(record)¶
Grava o registro no arquivo, tratando a rotação conforme descrito anteriormente.
- shouldRollover(record)¶
Verifica se o registro fornecido faria o arquivo exceder o limite de tamanho configurado.
TimedRotatingFileHandler¶
A classe TimedRotatingFileHandler, localizada no módulo logging.handlers, oferece suporte à rotação de arquivos de log em disco em intervalos de tempo determinados.
- class logging.handlers.TimedRotatingFileHandler(filename, when='h', interval=1, backupCount=0, encoding=None, delay=False, utc=False, atTime=None, errors=None)¶
Retorna uma nova instância da classe
TimedRotatingFileHandler. O arquivo especificado é aberto e usado como fluxo para o logging. Durante a rotação, o sufixo do nome do arquivo também é definido. A rotação ocorre com base no produto de when e interval.Você pode usar o when para especificar o tipo de intervalo. A lista de possíveis valores está abaixo. Observe que eles não diferenciam maiúsculas de minúsculas.
Valor
Tipo de intervalo
Se/como atTime é usado
'S'Segundos
Ignorado
'M'Minutos
Ignorado
'H'Horas
Ignorado
'D'Dias
Ignorado
'W0'-'W6'Dia da semana (0=Segunda)
Usado para calcular o tempo inicial de rotação
'midnight'Faz a rotação à meia-noite, se atTime não for especificado; caso contrário, no horário atTime.
Usado para calcular o tempo inicial de rotação
Ao usar rotação baseada em dia da semana, especifique ‘W0’ para segunda-feira, ‘W1’ para terça-feira, e assim por diante até ‘W6’ para domingo. Nesse caso, o valor passado para interval não é utilizado.
O sistema salvará arquivos de log antigos acrescentando extensões ao nome do arquivo. As extensões são baseadas em data e hora, usando o formato strftime
%Y-%m-%d_%H-%M-%Sou uma porção inicial dele, dependendo do intervalo de rollover.Quando a próximo rotação é calculada pela primeira vez (no momento em que o manipulador é criado), o tempo da última modificação de um arquivo de log existente — ou, caso contrário, o tempo atual — é usado para determinar quando a próxima rotação ocorrerá.
Se o argumento utc for verdadeiro, serão usados horários em Horário Universal Coordenado (UTC); caso contrário, será usado o horário local.
Se backupCount for diferente de zero, no máximo backupCount arquivos serão mantidos, e, se mais arquivos fossem criados quando ocorrer a rotação, o mais antigo será excluído. A lógica de exclusão usa o interval para determinar quais arquivos devem ser removidos; assim, alterar o intervalo pode deixar arquivos antigos remanescentes.
Se delay for verdadeiro, a abertura do arquivo será adiada até a primeira chamada para
emit().Se atTime não for
None, ele deve ser uma instância dedatetime.timeque especifica a hora do dia em que ocorre a rotação, nos casos em que a rotação está configurada para acontecer “à meia-noite” ou “em um determinado dia da semana”. Observe que, nesses casos, o valor de atTime é efetivamente usado para calcular a rotação inicial, e as rotações subsequentes são calculadas por meio do cálculo normal do intervalo.Se erros for especificado, ele será usado para determinar como erros de codificação são tratados.
Nota
O cálculo do tempo da rotação inicial é feito quando o manipulador é inicializado. O cálculo dos tempos de rotações subsequentes é feito apenas quando ocorre uma rotação, e a rotação ocorre somente quando há emissão de saída. Se isso não for levado em consideração, pode causar alguma confusão. Por exemplo, se for definido um intervalo de “a cada minuto”, isso não significa que você sempre verá arquivos de log com horários (no nome do arquivo) separados por um minuto; se, durante a execução da aplicação, a saída de log for gerada com maior frequência do que uma vez por minuto, então você pode esperar observar arquivos de log com horários separados por um minuto. Se, por outro lado, as mensagens de log forem emitidas apenas uma vez a cada cinco minutos (por exemplo), então haverá lacunas nos horários dos arquivos correspondentes aos minutos em que não houve saída (e, portanto, nenhuma rotação).
Alterado na versão 3.4: parâmetro atTime foi adicionado.
Alterado na versão 3.6: Além de valores do tipo string, objetos
Pathtambém são aceitos para o argumento filename.Alterado na versão 3.9: O parâmetro errors foi adicionado.
- doRollover()¶
Realiza uma rotação, conforme descrito acima.
- emit(record)¶
Emite o registro para o arquivo, com a preparação para a rotação, conforme descrito acima.
- getFilesToDelete()¶
Retorna uma lista de nomes de arquivos que devem ser excluídos como parte da rotação. Esses são os caminhos absolutos dos arquivos de log de backup mais antigos gravados pelo manipulador.
- shouldRollover(record)¶
Verifica se passou tempo suficiente para que a rotação ocorra e, se for o caso, calcula o próximo horário da rotação.
SocketHandler¶
A classe SocketHandler, localizada no módulo logging.handlers, envia a saída de logging para um soquete de rede. A classe base utiliza um soquete TCP.
- class logging.handlers.SocketHandler(host, port)¶
Retorna uma nova instância da classe
SocketHandler, destinada a se comunicar com uma máquina remota cujo endereço é fornecido por host e port.Alterado na versão 3.4: Se
portfor especificado comoNone, um Soquete de domínio Unix será criado usando o valor emhost- caso contrário, um soquete TCP será criado.- close()¶
Fecha o soquete.
- emit()¶
Serializa com pickle o dicionário de atributos do registro e o grava no soquete em formato binário. Se houver um erro com o soquete, o pacote é descartado silenciosamente. Se a conexão tiver sido perdida anteriormente, ela é restabelecida. Para desserializar com pickle o registro no lado receptor em um
LogRecord, use a funçãomakeLogRecord().
- handleError()¶
Trata um erro ocorrido durante
emit(). A causa mais provável é a perda da conexão. Fecha o soquete para que seja possível tentar novamente no próximo evento.
- makeSocket()¶
Este é um método de fábrica que permite que subclasses definam o tipo exato de soquete que desejam. A implementação padrão cria um soquete TCP (
socket.SOCK_STREAM).
- makePickle(record)¶
Serializa com pickle o dicionário de atributos do registro em formato binário com um prefixo de comprimento e o retorna pronto para transmissão através do socket. Os detalhes dessa operação são equivalentes a:
data = pickle.dumps(record_attr_dict, 1) datalen = struct.pack('>L', len(data)) return datalen + data
Observe que os pickles não são completamente seguros. Se você estiver preocupado com a segurança, pode ser necessário substituir este método para implementar um mecanismo mais seguro. Por exemplo, você pode assinar os pickles usando HMAC e depois verificá-los no lado receptor, ou alternativamente pode desativar a desserialização com pickle de objetos globais no lado receptor.
- send(packet)¶
Envia para o soquete uma string de bytes serializada com pickle denominada packet. O formato da string de bytes enviada é o descrito na documentação de
makePickle().Este função permite envios parciais, que podem ocorrer quando a rede está ocupada.
- createSocket()¶
Tenta criar um soquete; em caso de falha, utiliza um algoritmo de back-off exponencial. Na falha inicial, o manipulador descarta a mensagem que estava tentando enviar. Quando mensagens subsequentes são tratadas pela mesma instância, ela não tentará se reconectar até que algum tempo tenha passado. Os parâmetros padrão são tais que o atraso inicial é de um segundo e, se após esse atraso a conexão ainda não puder ser estabelecida, o manipulador dobrará o atraso a cada tentativa, até um máximo de 30 segundos.
Este comportamento é controlado pelo seguintes atributos do manipulador:
retryStart(atraso inicial, padrão de 1,0 segundo).retryFactor(multiplicador, com padrão de 2,0).retryMax(atraso máximo, padrão de 30,0 segundos).
Isso significa que, se o ouvinte remoto iniciar após o manipulador já ter sido utilizado, mensagens podem ser perdidas (pois o manipulador nem sequer tentará estabelecer uma conexão até que o atraso tenha decorrido, apenas descartando silenciosamente as mensagens durante esse período de atraso).
DatagramHandler¶
A classe DatagramHandler, localizada no módulo logging.handlers, herda de SocketHandler para oferecer suporte ao envio de mensagens de log por meio de soquetes UDP.
- class logging.handlers.DatagramHandler(host, port)¶
Retorna uma nova instância da classe
DatagramHandler, destinada a se comunicar com uma máquina remota cujo endereço é fornecido por host e port.Nota
Como o UDP não é um protocolo de fluxo contínuo, não há uma conexão persistente entre uma instância deste manipulador e host. Por esse motivo, ao usar um soquete de rede, pode ser necessário realizar uma consulta DNS a cada vez que um evento é registrado, o que pode introduzir alguma latência no sistema. Se isso for um problema para você, pode realizar a consulta manualmente e inicializar este manipulador usando o endereço IP obtido, em vez do nome do host.
Alterado na versão 3.4: Se
portfor especificado comoNone, um soquete de domínio Unix é criado usando o valor dehost; caso contrário, é criado um soquete UDP.- emit()¶
Serializa com pickle o dicionário de atributos do registro e o grava no soquete em formato binário. Se houver um erro com o soquete, o pacote é descartado silenciosamente. Para desserializar com pickle o registro no lado receptor em um
LogRecord, use a funçãomakeLogRecord().
- makeSocket()¶
A método de fábrica de
SocketHandleraqui é substituído para criar um soquete UDP (socket.SOCK_DGRAM).
- send(s)¶
Envia uma sequência de bytes serializada com pickle para um soquete. O formato da sequência de bytes enviada é conforme descrito na documentação de
SocketHandler.makePickle().
SysLogHandler¶
A classe SysLogHandler, localizada no módulo logging.handlers, oferece suporte ao envio de mensagens de log para um syslog Unix remoto ou local.
- class logging.handlers.SysLogHandler(address=('localhost', SYSLOG_UDP_PORT), facility=LOG_USER, socktype=socket.SOCK_DGRAM, timeout=None)¶
Returns a new instance of the
SysLogHandlerclass intended to communicate with a remote Unix machine whose address is given by address in the form of a(host, port)tuple. If address is not specified,('localhost', 514)is used. The address is used to open a socket. An alternative to providing a(host, port)tuple is providing an address as a string, for example ‘/dev/log’. In this case, a Unix domain socket is used to send the message to the syslog. If facility is not specified,LOG_USERis used. The type of socket opened depends on the socktype argument, which defaults tosocket.SOCK_DGRAMand thus opens a UDP socket. To open a TCP socket (for use with the newer syslog daemons such as rsyslog), specify a value ofsocket.SOCK_STREAM. If timeout is specified, it sets a timeout (in seconds) for the socket operations. This can help prevent the program from hanging indefinitely if the syslog server is unreachable. By default, timeout isNone, meaning no timeout is applied.Observe que, se o seu servidor não estiver escutando na porta UDP 514, o
SysLogHandlerpode parecer não funcionar. Nesse caso, verifique qual endereço deve ser usado para um soquete de domínio — isso depende do sistema. Por exemplo, no Linux geralmente é ‘/dev/log’, enquanto no OS/X é ‘/var/run/syslog’. Será necessário verificar a sua plataforma e usar o endereço apropriado (talvez seja preciso fazer essa verificação em tempo de execução se a aplicação precisar rodar em várias plataformas). No Windows, praticamente é necessário usar a opção UDP.Nota
No macOS 12.x (Monterey), a Apple alterou o comportamento do daemon syslog — ele não escuta mais em um soquete de domínio. Portanto, não é possível esperar que
SysLogHandlerfuncione nesse sistema.Consulte gh-91070 para obter mais informações.
Alterado na versão 3.2: socktype foi adicionado.
Alterado na versão 3.14: timeout foi adicionado.
- close()¶
Fecha o soquete para o host remoto.
- createSocket()¶
Tenta criar um soquete e, se ele não for um soquete de datagrama, conectá-lo à outra extremidade. Este método é chamado durante a inicialização do manipulador, mas não é considerado um erro se a outra extremidade não estiver escutando nesse momento — o método será chamado novamente ao emitir um evento, caso não haja um soquete nesse ponto.
Adicionado na versão 3.11.
- emit(record)¶
O registro é formatado e, em seguida, enviado ao servidor syslog. Se houver informações de exceção, elas não são enviadas ao servidor.
Alterado na versão 3.2.1: (Veja: bpo-12168.) Em versões anteriores, a mensagem enviada aos daemons syslog era sempre terminada com um byte NUL, porque versões antigas desses daemons esperavam uma mensagem terminada em NUL — embora isso não conste na especificação relevante (RFC 5424). Versões mais recentes desses daemons não esperam o byte NUL, mas o removem caso esteja presente, e daemons ainda mais recentes (que aderem mais de perto à RFC 5424) repassam o byte NUL como parte da mensagem.
Para facilitar o tratamento de mensagens do syslog diante de todos esses comportamentos distintos dos daemons, a adição do byte NUL tornou-se configurável por meio de um atributo em nível de classe,
append_nulO valor padrão éTrue(preservando o comportamento existente), mas pode ser definido comoFalseem uma instância deSysLogHandlerpara que essa instância não acrescente o terminador NUL.Alterado na versão 3.3: (Consulte: bpo-12419) Em versões anteriores, não havia uma instalação para um prefixo “ident” ou “tag” para identificar a origem da mensagem. Isso agora pode ser especificado usando um atributo de nível de classe, que por padrão é
""para preservar o comportamento existente, mas pode ser substituído em uma instância deSysLogHandlerpara que essa instância adicione o ident a cada mensagem manipulada. Observe que o ident fornecido deve ser texto, não bytes, e é adicionado à mensagem exatamente como está.
- encodePriority(facility, priority)¶
Codifica a instalação e a prioridade em um inteiro. Você pode passar strings ou inteiros — se strings forem passadas, dicionários de mapeamento internos são usados para convertê-las em inteiros.
Os valores simbólicos
LOG_são definidos emSysLogHandlere espelham os valores definidos no arquivo de cabeçalhosys/syslog.h.Prioridades
Nome (string)
Valor simbólico
alertLOG_ALERT
critoucriticalLOG_CRIT
debugLOG_DEBUG
emergorpanicLOG_EMERG
errouerrorLOG_ERR
infoLOG_INFO
noticeLOG_NOTICE
warnorwarningLOG_WARNING
Facilities
Nome (string)
Valor simbólico
authLOG_AUTH
authprivLOG_AUTHPRIV
cronLOG_CRON
daemonLOG_DAEMON
ftpLOG_FTP
kernLOG_KERN
lprLOG_LPR
mailLOG_MAIL
newsLOG_NEWS
syslogLOG_SYSLOG
userLOG_USER
uucpLOG_UUCP
local0LOG_LOCAL0
local1LOG_LOCAL1
local2LOG_LOCAL2
local3LOG_LOCAL3
local4LOG_LOCAL4
local5LOG_LOCAL5
local6LOG_LOCAL6
local7LOG_LOCAL7
- mapPriority(levelname)¶
Maps a logging level name to a syslog priority name. You may need to override this if you are using custom levels, or if the default algorithm is not suitable for your needs. The default algorithm maps
DEBUG,INFO,WARNING,ERRORandCRITICALto the equivalent syslog names, and all other level names to ‘warning’.
NTEventLogHandler¶
The NTEventLogHandler class, located in the logging.handlers
module, supports sending logging messages to a local Windows NT, Windows 2000 or
Windows XP event log. Before you can use it, you need Mark Hammond’s Win32
extensions for Python installed.
- class logging.handlers.NTEventLogHandler(appname, dllname=None, logtype='Application')¶
Returns a new instance of the
NTEventLogHandlerclass. The appname is used to define the application name as it appears in the event log. An appropriate registry entry is created using this name. The dllname should give the fully qualified pathname of a .dll or .exe which contains message definitions to hold in the log (if not specified,'win32service.pyd'is used - this is installed with the Win32 extensions and contains some basic placeholder message definitions. Note that use of these placeholders will make your event logs big, as the entire message source is held in the log. If you want slimmer logs, you have to pass in the name of your own .dll or .exe which contains the message definitions you want to use in the event log). The logtype is one of'Application','System'or'Security', and defaults to'Application'.- close()¶
At this point, you can remove the application name from the registry as a source of event log entries. However, if you do this, you will not be able to see the events as you intended in the Event Log Viewer - it needs to be able to access the registry to get the .dll name. The current version does not do this.
- emit(record)¶
Determines the message ID, event category and event type, and then logs the message in the NT event log.
- getEventCategory(record)¶
Returns the event category for the record. Override this if you want to specify your own categories. This version returns 0.
- getEventType(record)¶
Returns the event type for the record. Override this if you want to specify your own types. This version does a mapping using the handler’s typemap attribute, which is set up in
__init__()to a dictionary which contains mappings forDEBUG,INFO,WARNING,ERRORandCRITICAL. If you are using your own levels, you will either need to override this method or place a suitable dictionary in the handler’s typemap attribute.
- getMessageID(record)¶
Returns the message ID for the record. If you are using your own messages, you could do this by having the msg passed to the logger being an ID rather than a format string. Then, in here, you could use a dictionary lookup to get the message ID. This version returns 1, which is the base message ID in
win32service.pyd.
SMTPHandler¶
The SMTPHandler class, located in the logging.handlers module,
supports sending logging messages to an email address via SMTP.
- class logging.handlers.SMTPHandler(mailhost, fromaddr, toaddrs, subject, credentials=None, secure=None, timeout=1.0)¶
Returns a new instance of the
SMTPHandlerclass. The instance is initialized with the from and to addresses and subject line of the email. The toaddrs should be a list of strings. To specify a non-standard SMTP port, use the (host, port) tuple format for the mailhost argument. If you use a string, the standard SMTP port is used. If your SMTP server requires authentication, you can specify a (username, password) tuple for the credentials argument.To specify the use of a secure protocol (TLS), pass in a tuple to the secure argument. This will only be used when authentication credentials are supplied. The tuple should be either an empty tuple, or a single-value tuple with the name of a keyfile, or a 2-value tuple with the names of the keyfile and certificate file. (This tuple is passed to the
smtplib.SMTP.starttls()method.)A timeout can be specified for communication with the SMTP server using the timeout argument.
Alterado na versão 3.3: Added the timeout parameter.
- emit(record)¶
Formats the record and sends it to the specified addressees.
- getSubject(record)¶
If you want to specify a subject line which is record-dependent, override this method.
MemoryHandler¶
The MemoryHandler class, located in the logging.handlers module,
supports buffering of logging records in memory, periodically flushing them to a
target handler. Flushing occurs whenever the buffer is full, or when an
event of a certain severity or greater is seen.
MemoryHandler is a subclass of the more general
BufferingHandler, which is an abstract class. This buffers logging
records in memory. Whenever each record is added to the buffer, a check is made
by calling shouldFlush() to see if the buffer should be flushed. If it
should, then flush() is expected to do the flushing.
- class logging.handlers.BufferingHandler(capacity)¶
Initializes the handler with a buffer of the specified capacity. Here, capacity means the number of logging records buffered.
- emit(record)¶
Append the record to the buffer. If
shouldFlush()returns true, callflush()to process the buffer.
- flush()¶
For a
BufferingHandlerinstance, flushing means that it sets the buffer to an empty list. This method can be overwritten to implement more useful flushing behavior.
- shouldFlush(record)¶
Return
Trueif the buffer is up to capacity. This method can be overridden to implement custom flushing strategies.
- class logging.handlers.MemoryHandler(capacity, flushLevel=ERROR, target=None, flushOnClose=True)¶
Returns a new instance of the
MemoryHandlerclass. The instance is initialized with a buffer size of capacity (number of records buffered). If flushLevel is not specified,ERRORis used. If no target is specified, the target will need to be set usingsetTarget()before this handler does anything useful. If flushOnClose is specified asFalse, then the buffer is not flushed when the handler is closed. If not specified or specified asTrue, the previous behaviour of flushing the buffer will occur when the handler is closed.Alterado na versão 3.6: The flushOnClose parameter was added.
- flush()¶
For a
MemoryHandlerinstance, flushing means just sending the buffered records to the target, if there is one. The buffer is also cleared when buffered records are sent to the target. Override if you want different behavior.
- setTarget(target)¶
Sets the target handler for this handler.
- shouldFlush(record)¶
Checks for buffer full or a record at the flushLevel or higher.
HTTPHandler¶
The HTTPHandler class, located in the logging.handlers module,
supports sending logging messages to a web server, using either GET or
POST semantics.
- class logging.handlers.HTTPHandler(host, url, method='GET', secure=False, credentials=None, context=None)¶
Returns a new instance of the
HTTPHandlerclass. The host can be of the formhost:port, should you need to use a specific port number. If no method is specified,GETis used. If secure is true, a HTTPS connection will be used. The context parameter may be set to assl.SSLContextinstance to configure the SSL settings used for the HTTPS connection. If credentials is specified, it should be a 2-tuple consisting of userid and password, which will be placed in a HTTP ‘Authorization’ header using Basic authentication. If you specify credentials, you should also specify secure=True so that your userid and password are not passed in cleartext across the wire.Alterado na versão 3.5: The context parameter was added.
- mapLogRecord(record)¶
Provides a dictionary, based on
record, which is to be URL-encoded and sent to the web server. The default implementation just returnsrecord.__dict__. This method can be overridden if e.g. only a subset ofLogRecordis to be sent to the web server, or if more specific customization of what’s sent to the server is required.
- emit(record)¶
Sends the record to the web server as a URL-encoded dictionary. The
mapLogRecord()method is used to convert the record to the dictionary to be sent.
Nota
Since preparing a record for sending it to a web server is not the same as a generic formatting operation, using
setFormatter()to specify aFormatterfor aHTTPHandlerhas no effect. Instead of callingformat(), this handler callsmapLogRecord()and thenurllib.parse.urlencode()to encode the dictionary in a form suitable for sending to a web server.
QueueHandler¶
Adicionado na versão 3.2.
The QueueHandler class, located in the logging.handlers module,
supports sending logging messages to a queue, such as those implemented in the
queue or multiprocessing modules.
Along with the QueueListener class, QueueHandler can be used
to let handlers do their work on a separate thread from the one which does the
logging. This is important in web applications and also other service
applications where threads servicing clients need to respond as quickly as
possible, while any potentially slow operations (such as sending an email via
SMTPHandler) are done on a separate thread.
- class logging.handlers.QueueHandler(queue)¶
Returns a new instance of the
QueueHandlerclass. The instance is initialized with the queue to send messages to. The queue can be any queue-like object; it’s used as-is by theenqueue()method, which needs to know how to send messages to it. The queue is not required to have the task tracking API, which means that you can useSimpleQueueinstances for queue.Nota
If you are using
multiprocessing, you should avoid usingSimpleQueueand instead usemultiprocessing.Queue.Aviso
The
multiprocessingmodule uses an internal logger created and accessed viaget_logger().multiprocessing.Queuewill logDEBUGlevel messages upon items being queued. If those log messages are processed by aQueueHandlerusing the samemultiprocessing.Queueinstance, it will cause a deadlock or infinite recursion.- emit(record)¶
Enqueues the result of preparing the LogRecord. Should an exception occur (e.g. because a bounded queue has filled up), the
handleError()method is called to handle the error. This can result in the record silently being dropped (iflogging.raiseExceptionsisFalse) or a message printed tosys.stderr(iflogging.raiseExceptionsisTrue).
- prepare(record)¶
Prepares a record for queuing. The object returned by this method is enqueued.
The base implementation formats the record to merge the message, arguments, exception and stack information, if present. It also removes unpickleable items from the record in-place. Specifically, it overwrites the record’s
msgandmessageattributes with the merged message (obtained by calling the handler’sformat()method), and sets theargs,exc_infoandexc_textattributes toNone.You might want to override this method if you want to convert the record to a dict or JSON string, or send a modified copy of the record while leaving the original intact.
Nota
The base implementation formats the message with arguments, sets the
messageandmsgattributes to the formatted message and sets theargsandexc_textattributes toNoneto allow pickling and to prevent further attempts at formatting. This means that a handler on theQueueListenerside won’t have the information to do custom formatting, e.g. of exceptions. You may wish to subclassQueueHandlerand override this method to e.g. avoid settingexc_texttoNone. Note that themessage/msg/argschanges are related to ensuring the record is pickleable, and you might or might not be able to avoid doing that depending on whether yourargsare pickleable. (Note that you may have to consider not only your own code but also code in any libraries that you use.)
- enqueue(record)¶
Enqueues the record on the queue using
put_nowait(); you may want to override this if you want to use blocking behaviour, or a timeout, or a customized queue implementation.
- listener¶
When created via configuration using
dictConfig(), this attribute will contain aQueueListenerinstance for use with this handler. Otherwise, it will beNone.Adicionado na versão 3.12.
QueueListener¶
Adicionado na versão 3.2.
The QueueListener class, located in the logging.handlers
module, supports receiving logging messages from a queue, such as those
implemented in the queue or multiprocessing modules. The
messages are received from a queue in an internal thread and passed, on
the same thread, to one or more handlers for processing. While
QueueListener is not itself a handler, it is documented here
because it works hand-in-hand with QueueHandler.
Along with the QueueHandler class, QueueListener can be used
to let handlers do their work on a separate thread from the one which does the
logging. This is important in web applications and also other service
applications where threads servicing clients need to respond as quickly as
possible, while any potentially slow operations (such as sending an email via
SMTPHandler) are done on a separate thread.
- class logging.handlers.QueueListener(queue, *handlers, respect_handler_level=False)¶
Returns a new instance of the
QueueListenerclass. The instance is initialized with the queue to send messages to and a list of handlers which will handle entries placed on the queue. The queue can be any queue-like object; it’s passed as-is to thedequeue()method, which needs to know how to get messages from it. The queue is not required to have the task tracking API (though it’s used if available), which means that you can useSimpleQueueinstances for queue.Nota
If you are using
multiprocessing, you should avoid usingSimpleQueueand instead usemultiprocessing.Queue.If
respect_handler_levelisTrue, a handler’s level is respected (compared with the level for the message) when deciding whether to pass messages to that handler; otherwise, the behaviour is as in previous Python versions - to always pass each message to each handler.Alterado na versão 3.5: The
respect_handler_levelargument was added.Alterado na versão 3.14:
QueueListenercan now be used as a context manager viawith. When entering the context, the listener is started. When exiting the context, the listener is stopped.__enter__()returns theQueueListenerobject.- dequeue(block)¶
Dequeues a record and return it, optionally blocking.
The base implementation uses
get(). You may want to override this method if you want to use timeouts or work with custom queue implementations.
- prepare(record)¶
Prepare a record for handling.
This implementation just returns the passed-in record. You may want to override this method if you need to do any custom marshalling or manipulation of the record before passing it to the handlers.
- handle(record)¶
Handle a record.
This just loops through the handlers offering them the record to handle. The actual object passed to the handlers is that which is returned from
prepare().
- start()¶
Starts the listener.
This starts up a background thread to monitor the queue for LogRecords to process.
Alterado na versão 3.14: Raises
RuntimeErrorif called and the listener is already running.
- stop()¶
Stops the listener.
This asks the thread to terminate, and then waits for it to do so. Note that if you don’t call this before your application exits, there may be some records still left on the queue, which won’t be processed.
- enqueue_sentinel()¶
Writes a sentinel to the queue to tell the listener to quit. This implementation uses
put_nowait(). You may want to override this method if you want to use timeouts or work with custom queue implementations.Adicionado na versão 3.3.
Ver também
- Módulo
logging Referência da API para o módulo de logging.
- Módulo
logging.config API de configuração para o módulo logging.