如何自定义Python日志的时间格式?

我是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,但困惑。我很感激你帮我实现目标。谢谢你!

212936 次浏览

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

如果在配置文件中使用logging.config.fileConfig,可以这样使用:

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

使用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

为了补充其他答案,这里是Python文档中的变量列表

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.

试试这些格式:

格式1:

'formatters': {
'standard': {
'format' : '%(asctime)s |:| LEVEL: %(levelname)s |:| FILE PATH: %(pathname)s |:| FUNCTION/METHOD: %(funcName)s %(message)s |:| LINE NO.: %(lineno)d |:| PROCESS ID: %(process)d |:| THREAD ID: %(thread)d',
'datefmt' : "%y/%b/%Y %H:%M:%S"
},
}

格式1的输出:

enter image description here

< br > < br >

格式2:

'formatters': {
'standard': {
'format' : '%(asctime)s |:| LEVEL: %(levelname)s |:| FILE PATH: %(pathname)s |:| FUNCTION/METHOD: %(funcName)s %(message)s |:| LINE NO.: %(lineno)d |:| PROCESS ID: %(process)d |:| THREAD ID: %(thread)d',
'datefmt' : "%Y-%m-%d %H:%M:%S"
},
}

格式2的输出:

enter image description here

为了在记录日志时自定义时间格式,我们可以创建一个logger对象和一个fileHandler到它。

        import logging
from datetime import datetime


logger = logging.getLogger("OSA")


logger.setLevel(logging.DEBUG)


filename = datetime.now().strftime("%Y-%m-%d %H:%M:%S") + ".log"
fileHandler = logging.FileHandler(filename, mode="a")#'a' for append you can use 'w' for write


formatter = logging.Formatter(
"%(asctime)s : %(levelname)s : [%(filename)s:%(lineno)s - %(funcName)s()] : %(message)s",
"%Y-%m-%d %H:%M:%S")


fileHandler.setFormatter(formatter)
logger.addHandler(fileHandler)