2010-07-10 30 views
107

Tôi mới sử dụng gói ghi nhật ký của Python và có kế hoạch 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 mình. Đây là một mã ngắn tôi sao chép từ một hướng dẫn:Làm thế nào để tùy chỉnh định dạng thời gian cho việc ghi nhật ký 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") 

Và đây là kết quả:

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 thời gian định dạng chỉ: '2010-07-10 10:46:28', thả mili- hậu tố thứ hai. 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.

Trả lời

124

Từ official documentation về lớp Formatter:

Các nhà xây dựng phải mất hai đối số tùy chọn: một chuỗi định dạng thông điệp và một chuỗi định dạng ngày tháng.

Vì vậy, thay đổi

# 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") 
+12

Lưu ý rằng nếu bạn đang sử dụng phương pháp định cấu hình đăng nhập dictConfig (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 'datefmt' dict cho trình định dạng. Xem: [Cấu hình ghi nhật ký Django] (http://docs.djangoproject.com/en/dev/topics/logging/#configuring-logging), [mô-đun ghi nhật ký: Chi tiết lược đồ từ điển] (http: //docs.python. org/2/library/logging.config.html # dictionary-schema-details) – taleinat

+3

Ngoài ra, nếu bạn định cấu hình ghi nhật ký với basicConfig, nó có tham số được đặt tên được gọi là datefmt –

+3

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': { 'mặc định': { 'định dạng': '% (asctime) s | % (tên cấp) s | % (module) s | % (message) s ', ' datefmt ':'% Y-% m-% d% H:% M ', }, ' – jcfollower

22

nếu sử dụng logging.config.fileConfig với một cái gì đó sử dụng tập tin cấu hình như:

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

Sử dụng logging.basicConfig, ví dụ sau hoạt động cho 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 & định cấu hình tất cả trong một dòng. Một kỷ lục ghi kết quả trông như sau:

2014/05/26 12: 22: 52,376 historylistener QUAN TRỌNG - chính: Lịch sử đăng nhập thất bại trong việc bắt đầu

+4

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

+1

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

6

Để thêm vào các câu trả lời khác, đây là những variable list từ Python Tài liệu .

Directive Meaning Notes 

%a Locale’s abbreviated weekday name. 
%A Locale’s full weekday name. 
%b Locale’s abbreviated month name.  
%B Locale’s full month name.  
%c Locale’s 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 Locale’s 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 Locale’s appropriate date representation.  
%X Locale’s 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.  
Các vấn đề liên quan