파이썬 로깅 : 시간 형식으로 밀리 초 사용
기본적으로 logging.Formatter('%(asctime)s')
다음 형식 으로 인쇄됩니다.
2011-06-09 10:54:40,638
여기서 638은 밀리 초입니다. 쉼표를 점으로 변경해야합니다.
2011-06-09 10:54:40.638
사용할 수있는 시간을 형식화하려면 다음을 수행하십시오.
logging.Formatter(fmt='%(asctime)s',datestr=date_format_str)
그러나 설명서 에는 밀리 초 형식을 지정하는 방법이 나와 있지 않습니다. 나는 마이크로 초에 대해 이야기하는 이 SO 질문 을 찾았 지만 a) 밀리 초를 선호하고 b) 다음으로 인해 Python 2.6에서 작동하지 않습니다 %f
.
logging.Formatter(fmt='%(asctime)s',datefmt='%Y-%m-%d,%H:%M:%S.%f')
유의하시기 바랍니다 크레이그 맥다니엘의 솔루션은 분명히 낫다.
logging.Formatter의 formatTime
메소드는 다음과 같습니다.
def formatTime(self, record, datefmt=None):
ct = self.converter(record.created)
if datefmt:
s = time.strftime(datefmt, ct)
else:
t = time.strftime("%Y-%m-%d %H:%M:%S", ct)
s = "%s,%03d" % (t, record.msecs)
return s
의 쉼표를 확인하십시오 "%s,%03d"
. datefmt
이유 ct
는 a 를 지정하여 해결할 수 없으며 time.struct_time
이러한 개체는 밀리 초를 기록하지 않습니다.
정의를 변경하여 객체 대신 객체 ct
를 만들려면 (적어도 최신 버전의 Python에서는) 호출 할 수 있으며 마이크로 초 형식을 지정할 수 있습니다 .datetime
struct_time
ct.strftime
%f
import logging
import datetime as dt
class MyFormatter(logging.Formatter):
converter=dt.datetime.fromtimestamp
def formatTime(self, record, datefmt=None):
ct = self.converter(record.created)
if datefmt:
s = ct.strftime(datefmt)
else:
t = ct.strftime("%Y-%m-%d %H:%M:%S")
s = "%s,%03d" % (t, record.msecs)
return s
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
console = logging.StreamHandler()
logger.addHandler(console)
formatter = MyFormatter(fmt='%(asctime)s %(message)s',datefmt='%Y-%m-%d,%H:%M:%S.%f')
console.setFormatter(formatter)
logger.debug('Jackdaws love my big sphinx of quartz.')
# 2011-06-09,07:12:36.553554 Jackdaws love my big sphinx of quartz.
또는 밀리 초를 얻으려면 쉼표를 소수점으로 변경하고 datefmt
인수를 생략하십시오 .
class MyFormatter(logging.Formatter):
converter=dt.datetime.fromtimestamp
def formatTime(self, record, datefmt=None):
ct = self.converter(record.created)
if datefmt:
s = ct.strftime(datefmt)
else:
t = ct.strftime("%Y-%m-%d %H:%M:%S")
s = "%s.%03d" % (t, record.msecs)
return s
...
formatter = MyFormatter(fmt='%(asctime)s %(message)s')
...
logger.debug('Jackdaws love my big sphinx of quartz.')
# 2011-06-09 08:14:38.343 Jackdaws love my big sphinx of quartz.
이것도 작동해야합니다.
logging.Formatter(fmt='%(asctime)s.%(msecs)03d',datefmt='%Y-%m-%d,%H:%M:%S')
msecs를 추가하는 것이 더 좋은 방법입니다. 감사합니다. 블렌더에서 Python 3.5.3을 사용하여 수정 한 내용은 다음과 같습니다.
import logging
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s.%(msecs)03d %(levelname)s:\t%(message)s', datefmt='%Y-%m-%d %H:%M:%S')
log = logging.getLogger(__name__)
log.info("Logging Info")
log.debug("Logging Debug")
내가 찾은 가장 간단한 방법은 default_msec_format을 재정의하는 것입니다.
formatter = logging.Formatter('%(asctime)s')
formatter.default_msec_format = '%s.%03d'
인스턴스화 후 Formatter
보통 설정 formatter.converter = gmtime
합니다. 따라서이 경우 @unutbu의 답변이 작동하려면 다음이 필요합니다.
class MyFormatter(logging.Formatter):
def formatTime(self, record, datefmt=None):
ct = self.converter(record.created)
if datefmt:
s = time.strftime(datefmt, ct)
else:
t = time.strftime("%Y-%m-%d %H:%M:%S", ct)
s = "%s.%03d" % (t, record.msecs)
return s
A simple expansion that doesn't require the datetime
module and isn't handicapped like some other solutions is to use simple string replacement like so:
import logging
import time
class MyFormatter(logging.Formatter):
def formatTime(self, record, datefmt=None):
ct = self.converter(record.created)
if datefmt:
if "%F" in datefmt:
msec = "%03d" % record.msecs
datefmt = datefmt.replace("%F", msec)
s = time.strftime(datefmt, ct)
else:
t = time.strftime("%Y-%m-%d %H:%M:%S", ct)
s = "%s,%03d" % (t, record.msecs)
return s
This way a date format can be written however you want, even allowing for region differences, by using %F
for milliseconds. For example:
log = logging.getLogger(__name__)
log.setLevel(logging.INFO)
sh = logging.StreamHandler()
log.addHandler(sh)
fm = MyFormatter(fmt='%(asctime)s-%(levelname)s-%(message)s',datefmt='%H:%M:%S.%F')
sh.setFormatter(fm)
log.info("Foo, Bar, Baz")
# 03:26:33.757-INFO-Foo, Bar, Baz
If you are using arrow or if you don't mind using arrow. You can substitute python's time formatting for arrow's one.
import logging
from arrow.arrow import Arrow
class ArrowTimeFormatter(logging.Formatter):
def formatTime(self, record, datefmt=None):
arrow_time = Arrow.fromtimestamp(record.created)
if datefmt:
arrow_time = arrow_time.format(datefmt)
return str(arrow_time)
logger = logging.getLogger(__name__)
default_handler = logging.StreamHandler()
default_handler.setFormatter(ArrowTimeFormatter(
fmt='%(asctime)s',
datefmt='YYYY-MM-DD HH:mm:ss.SSS'
))
logger.setLevel(logging.DEBUG)
logger.addHandler(default_handler)
Now you can use all of arrow's time formatting in datefmt
attribute.
참고URL : https://stackoverflow.com/questions/6290739/python-logging-use-milliseconds-in-time-format
'IT story' 카테고리의 다른 글
Guzzlehttp-Guzzle 6에서 응답 본문을 얻는 방법은 무엇입니까? (0) | 2020.06.23 |
---|---|
루비에서 해시 배열을 정렬하는 방법 (0) | 2020.06.23 |
안드로이드 화면 키보드 자동 팝업 (0) | 2020.06.23 |
Laravel Eloquent 생성 및 업데이트 (0) | 2020.06.23 |
.net에서 Windows 버전 감지 (0) | 2020.06.23 |