파이썬 로깅의 시간 형식을 사용자 정의하는 방법은 무엇입니까?


200

Python의 로깅 패키지를 처음 사용하고 프로젝트에 사용할 계획입니다. 시간 형식을 취향에 맞게 사용자 정의하고 싶습니다. 튜토리얼에서 복사 한 짧은 코드는 다음과 같습니다.

import logging

# create logger
logger = logging.getLogger("logging_tryout2")
logger.setLevel(logging.DEBUG)

# create console handler and set level to debug
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)

# create formatter
formatter = logging.Formatter("%(asctime)s;%(levelname)s;%(message)s")

# add formatter to ch
ch.setFormatter(formatter)

# add ch to logger
logger.addHandler(ch)

# "application" code
logger.debug("debug message")
logger.info("info message")
logger.warn("warn message")
logger.error("error message")
logger.critical("critical message")

그리고 출력은 다음과 같습니다.

2010-07-10 10:46:28,811;DEBUG;debug message
2010-07-10 10:46:28,812;INFO;info message
2010-07-10 10:46:28,812;WARNING;warn message
2010-07-10 10:46:28,812;ERROR;error message
2010-07-10 10:46:28,813;CRITICAL;critical message

시간 형식을 ' 2010-07-10 10:46:28'(으) 로 줄이고 밀리 초 접미사를 삭제하고 싶습니다 . Formatter.formatTime을 보았지만 혼란 스러웠습니다. 목표 달성에 도움을 주셔서 감사합니다. 감사합니다.

답변:


224

포맷터 클래스에 관한 공식 문서 에서 :

생성자는 메시지 형식 문자열과 날짜 형식 문자열의 두 가지 선택적 인수를 사용합니다.

따라서 변경

# create formatter
formatter = logging.Formatter("%(asctime)s;%(levelname)s;%(message)s")

# create formatter
formatter = logging.Formatter("%(asctime)s;%(levelname)s;%(message)s",
                              "%Y-%m-%d %H:%M:%S")

24
로깅을 구성하는 dictConfig 메소드를 사용하는 경우 (예 : Django를 사용하는 경우) 포맷터에 대해 'datefmt'dict 키를 사용하여이를 설정할 수 있습니다. 참고 : Django Logging Configuration , 로깅 모듈 : Dictionary Schema Details
taleinat

8
당신이 basicConfig와 로깅을 구성 할 경우에도, 그것은 datefmt라는 명명 된 매개 변수 소요
브루노 로페스

10
1.9에서 LOGGING 설정을 사용하는 경우 다음과 같이 'datefmt'항목을 포함 할 수 있습니다. 'formatters': { 'default': { 'format': '%(asctime)s | %(levelname)s | %(module)s | %(message)s', 'datefmt': '%Y-%m-%d %H:%M', },
jcfollower

시간대는 어떻게 되나요?
Luv33preet

@ Luv33preet의 '%의 Z'
shrmn

138

를 사용 logging.basicConfig하면 다음 예제가 효과적입니다.

logging.basicConfig(
    filename='HISTORYlistener.log',
    level=logging.DEBUG,
    format='%(asctime)s.%(msecs)03d %(levelname)s %(module)s - %(funcName)s: %(message)s',
    datefmt='%Y-%m-%d %H:%M:%S',
)

이를 통해 한 줄에 모두 서식을 지정하고 구성 할 수 있습니다. 결과 로그 레코드는 다음과 같습니다.

2014-05-26 12:22:52.376 CRITICAL historylistener - main: History log failed to start

4
msecs 필드에 0으로 채워진 형식을 추가했습니다. 그렇지 않으면 100보다 작은 msecs 값이 잘못 나타납니다.
Oddthinking

2
즉, OP는 msecs가 전혀 표시되는 것을 원하지 않습니다!
Oddthinking

31

구성 파일과 함께 logging.config.fileConfig를 사용하는 경우 다음과 같은 것을 사용하십시오.

[formatter_simpleFormatter]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
datefmt=%Y-%m-%d %H:%M:%S

29

다른 답변에 추가하려면 다음 은 Python 설명서 의 변수 목록 입니다.

Directive   Meaning Notes

%a  Locales abbreviated weekday name.   
%A  Locales full weekday name.  
%b  Locales abbreviated month name.     
%B  Locales full month name.    
%c  Locales appropriate date and time representation.   
%d  Day of the month as a decimal number [01,31].    
%H  Hour (24-hour clock) as a decimal number [00,23].    
%I  Hour (12-hour clock) as a decimal number [01,12].    
%j  Day of the year as a decimal number [001,366].   
%m  Month as a decimal number [01,12].   
%M  Minute as a decimal number [00,59].  
%p  Locales equivalent of either AM or PM. (1)
%S  Second as a decimal number [00,61]. (2)
%U  Week number of the year (Sunday as the first day of the week) as a decimal number [00,53]. All days in a new year preceding the first Sunday are considered to be in week 0.    (3)
%w  Weekday as a decimal number [0(Sunday),6].   
%W  Week number of the year (Monday as the first day of the week) as a decimal number [00,53]. All days in a new year preceding the first Monday are considered to be in week 0.    (3)
%x  Locales appropriate date representation.    
%X  Locales appropriate time representation.    
%y  Year without century as a decimal number [00,99].    
%Y  Year with century as a decimal number.   
%z  Time zone offset indicating a positive or negative time difference from UTC/GMT of the form +HHMM or -HHMM, where H represents decimal hour digits and M represents decimal minute digits [-23:59, +23:59].  
%Z  Time zone name (no characters if no time zone exists).   
%%  A literal '%' character.     
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.