Por padrão, logging.Formatter('%(asctime)s')
imprime com o seguinte formato:
2011-06-09 10:54:40,638
onde 638 é o milissegundo. Preciso alterar a vírgula para um ponto:
2011-06-09 10:54:40.638
Para formatar a hora que posso usar:
logging.Formatter(fmt='%(asctime)s',datestr=date_format_str)
no entanto, a documentação não especifica como formatar milissegundos. Eu encontrei esta pergunta SO que fala sobre microssegundos, mas a) eu preferiria milissegundos eb) o seguinte não funciona no Python 2.6 (no qual estou trabalhando) devido ao %f
:
logging.Formatter(fmt='%(asctime)s',datefmt='%Y-%m-%d,%H:%M:%S.%f')
%f
não funciona em python 2.7.9 ou 3.5.1, querlogging
afirma que seu formato de hora padrão segue a ISO 8601. Não é. Ele usa espaço, não "T" para separar o tempo e a vírgula por segundos fracionários, não o ponto decimal. Como eles poderiam estar tão errados?Respostas:
Observe que a solução de Craig McDaniel é claramente melhor.
O
formatTime
método do log de formatação é assim:Observe a vírgula em
"%s,%03d"
. Isso não pode ser corrigido especificando adatefmt
porquect
é atime.struct_time
e esses objetos não registram milissegundos.Se mudarmos a definição de
ct
para torná-lo umdatetime
objeto em vez de astruct_time
, então (pelo menos nas versões modernas do Python) podemos chamarct.strftime
e então podemos usar%f
para formatar microssegundos:Ou, para obter milissegundos, altere a vírgula para um ponto decimal e omita o
datefmt
argumento:fonte
%f
dá microssegundos. Suponho que a maneira mais fácil de obter milissegundos é alterar a vírgula para um ponto decimal (veja a edição acima).Isso deve funcionar também:
fonte
%z
ou%Z
em suadatefmt
que você quer que apareça após o msecs, não antes.AM
ouPM
from time import gmtime
-# Use UTC rather than local date/time
-logging.Formatter.converter = gmtime
-logging.basicConfig(datefmt='%Y-%m-%dT%H:%M:%S', format='%(name)s | %(asctime)s.%(msecs)03dZ | %(message)s', level=log_level)
default_msec_format
(a partir do Python 3,7) porque apenas o tempo e milissegundos são substituídos em A partir da.logging
Fonte:self.default_msec_format % (t, record.msecs)
Adicionar msegs foi a melhor opção, obrigado. Aqui está a minha alteração usando isso com o Python 3.5.3 no Blender
fonte
A maneira mais simples que encontrei foi substituir default_msec_format:
fonte
Depois de instanciar um
Formatter
eu costumo definirformatter.converter = gmtime
. Portanto, para que a resposta do @ unutbu funcione nesse caso, você precisará:fonte
Uma expansão simples que não requer o
datetime
módulo e não é prejudicada como algumas outras soluções é usar a substituição simples de cadeias da seguinte maneira:Dessa forma, um formato de data pode ser gravado da maneira que você desejar, mesmo permitindo diferenças de região, usando
%F
por milissegundos. Por exemplo:fonte
Se você estiver usando flecha ou se não se importa em usar flecha. Você pode substituir a formatação da hora do python pela seta.
Agora você pode usar toda a formatação da hora da seta no
datefmt
atributofonte
tl; dr para pessoas que procuram aqui uma data no formato ISO:
datefmt: '% Y-% m-% d% H:% M:% S.% 03d% z'
fonte
A partir de agora, o seguinte funciona perfeitamente com o python 3.
dá a seguinte saída
fonte