Làm cách nào để tùy chỉnh định dạng thời gian để ghi nhật ký Python?


200

Tôi chưa quen với gói ghi nhật ký của Python và dự định sử dụng nó cho dự án của tôi. Tôi muốn tùy chỉnh định dạng thời gian theo sở thích của tôi. Đây là một đoạn mã ngắn mà tôi đã sao chép từ một hướng dẫn:

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")

Và đây là đầu ra:

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

Tôi muốn rút ngắn định dạng thời gian thành: ' 2010-07-10 10:46:28', bỏ hậu tố mili-giây. Tôi nhìn vào Formatter.formatTime, nhưng bối rối. Tôi đánh giá cao sự giúp đỡ của bạn để đạt được mục tiêu của tôi. Cảm ơn bạn.

Câu trả lời:


224

Từ tài liệu chính thức về lớp Formatter:

Hàm tạo có hai đối số tùy chọn: chuỗi định dạng thông báo và chuỗi định dạng ngày.

Vì vậy, thay đổi

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

đến

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

24
Lưu ý rằng nếu bạn đang sử dụng phương pháp dictConfig để định cấu hình ghi nhật ký (ví dụ: nếu bạn đang sử dụng Django), bạn có thể đặt điều này bằng cách sử dụng khóa chính tả 'datefmt' cho một trình định dạng. Xem: Cấu hình ghi nhật ký Django , mô đun ghi nhật ký: Chi tiết lược đồ từ điển
taleinat

8
Ngoài ra, nếu bạn định cấu hình ghi nhật ký với basicConfig, sẽ mất một tham số có tên là datefmt
Bruno Lopes

10
Trong 1.9, nếu bạn đang sử dụng cài đặt LOGGING, bạn có thể bao gồm mục nhập 'datefmt' như thế này ...'formatters': { 'default': { 'format': '%(asctime)s | %(levelname)s | %(module)s | %(message)s', 'datefmt': '%Y-%m-%d %H:%M', },
jcfollower

múi giờ sẽ là gì?
Luv33preet

@ Luv33preet '% z' của nó
thu nhỏ

139

Sử dụng logging.basicConfig, ví dụ sau đây hoạt động với tôi:

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',
)

Điều này cho phép bạn định dạng & cấu hình tất cả trong một dòng. Một bản ghi nhật ký kết quả trông như sau:

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

4
Tôi đã thêm định dạng không đệm cho trường msecs. Mặt khác, giá trị msecs nhỏ hơn 100 xuất hiện không chính xác.
Oddthinking

2
Điều đó nói rằng, OP không muốn msecs xuất hiện ở tất cả!
Oddthinking

31

nếu sử dụng log.config.fileConfig với tệp cấu hình, hãy sử dụng một cái gì đó như:

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

29

Để thêm vào các câu trả lời khác, đây là danh sách biến từ Tài liệu 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.     
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.