วิธีกำหนดรูปแบบเวลาสำหรับการบันทึก Python เอง


201

ฉันยังใหม่กับแพ็คเกจการบันทึกของ 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' วางส่วนต่อท้าย mili-second ฉันดูที่ Formatter.formatTime แต่สับสน ฉันขอขอบคุณที่คุณช่วยให้บรรลุเป้าหมาย ขอบคุณ.

คำตอบ:


225

จากเอกสารอย่างเป็นทางการเกี่ยวกับชั้น Formatter:

ตัวสร้างใช้เวลาสองอาร์กิวเมนต์ที่เป็นตัวเลือก: สตริงรูปแบบข้อความและสตริงรูปแบบวันที่

ดังนั้นเปลี่ยน

# 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' สำหรับฟอร์แมตเตอร์ โปรดดู: การกำหนดค่าการบันทึก Django , โมดูลการบันทึก: รายละเอียด Schema ของพจนานุกรม
taleinat

8
นอกจากนี้หากการกำหนดค่าการบันทึกของคุณด้วย basicConfig มันต้องใช้ชื่อพารามิเตอร์ที่เรียกว่า datefmt
Bruno Lopes

10
ใน 1.9 หากคุณกำลังใช้การตั้งค่าการบันทึกคุณสามารถรวมรายการ 'datefmt' เช่นนี้ ...'formatters': { 'default': { 'format': '%(asctime)s | %(levelname)s | %(module)s | %(message)s', 'datefmt': '%Y-%m-%d %H:%M', },
jcfollower

เขตเวลาจะเป็นอย่างไร
Luv33preet

@ Luv33preet มัน '% z'
ลดลง

142

ใช้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 มิฉะนั้นค่า msecs น้อยกว่า 100 จะปรากฏขึ้นอย่างไม่ถูกต้อง
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 Documentation

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.