Secara default logging.Formatter('%(asctime)s')
mencetak dengan format berikut:
2011-06-09 10:54:40,638
di mana 638 adalah milidetik. Saya perlu mengubah koma ke titik:
2011-06-09 10:54:40.638
Untuk memformat waktu yang dapat saya gunakan:
logging.Formatter(fmt='%(asctime)s',datestr=date_format_str)
namun dokumentasi tidak menentukan cara memformat milidetik. Saya telah menemukan pertanyaan SO ini yang berbicara tentang mikrodetik, tetapi a) Saya lebih suka milidetik dan b) yang berikut ini tidak berfungsi pada Python 2.6 (yang sedang saya kerjakan) karena %f
:
logging.Formatter(fmt='%(asctime)s',datefmt='%Y-%m-%d,%H:%M:%S.%f')
%f
tidak bekerja pada python 2.7.9 atau 3.5.1 baiklogging
mengklaim format waktu standarnya mengikuti ISO 8601. Tidak. Ini menggunakan ruang, bukan "T" untuk memisahkan waktu dan koma untuk detik pecahan, bukan titik desimal. Bagaimana mereka bisa salah?Jawaban:
Harap dicatat solusi Craig McDaniel jelas lebih baik.
formatTime
metode logging.Formatter terlihat seperti ini:Perhatikan koma di
"%s,%03d"
. Ini tidak dapat diperbaiki dengan menentukan adatefmt
karenact
is atime.struct_time
dan objek-objek ini tidak merekam milidetik.Jika kita mengubah definisi
ct
untuk menjadikannyadatetime
objek, bukan astruct_time
, maka (setidaknya dengan versi Python modern) kita dapat memanggilct.strftime
dan kemudian kita dapat gunakan%f
untuk memformat mikrodetik:Atau, untuk mendapatkan milidetik, ubah koma ke titik desimal, dan hilangkan
datefmt
argumen:sumber
%f
memberikan mikrodetik. Saya kira cara termudah untuk mendapatkan milidetik adalah dengan mengubah koma ke titik desimal (lihat edit di atas).Ini juga harus bekerja:
sumber
%z
atau%Z
di Andadatefmt
Anda ingin itu muncul SETELAH msecs, bukan sebelumnya.AM
atauPM
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
(pada Python 3.7) karena hanya waktu dan milidetik yang dimasukkan. Darilogging
sumber:self.default_msec_format % (t, record.msecs)
Menambahkan msec adalah opsi yang lebih baik, Terima kasih. Ini amandemen saya menggunakan ini dengan Python 3.5.3 di Blender
sumber
Cara paling sederhana yang saya temukan adalah menimpa default_msec_format:
sumber
Setelah instantiating
Formatter
saya biasanya mengaturformatter.converter = gmtime
. Jadi agar jawaban @ unutbu berfungsi dalam hal ini, Anda perlu:sumber
Perluasan sederhana yang tidak memerlukan
datetime
modul dan tidak cacat seperti beberapa solusi lain adalah dengan menggunakan penggantian string sederhana seperti:Dengan cara ini format tanggal dapat ditulis sesuai keinginan Anda, bahkan memungkinkan untuk perbedaan wilayah, dengan menggunakan
%F
selama milidetik. Sebagai contoh:sumber
Jika Anda menggunakan panah atau jika Anda tidak keberatan menggunakan panah. Anda dapat mengganti format waktu python dengan yang panah.
Sekarang Anda dapat menggunakan semua format waktu panah di
datefmt
atribut.sumber
tl; dr untuk orang yang mencari tanggal diformat ISO di sini:
datefmt: '% Y-% m-% d% H:% M:% S.% 03d% z'
sumber
Sampai sekarang berikut ini berfungsi dengan sempurna dengan python 3.
memberikan hasil sebagai berikut
sumber