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

Hai*_* Vu 171 python formatting logging datetime

我是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")
Run Code Online (Sandbox Code Playgroud)

这是输出:

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
Run Code Online (Sandbox Code Playgroud)

我想将时间格式缩短为:' 2010-07-10 10:46:28',删除mili-second后缀.我查看了Formatter.formatTime,但很困惑.感谢您帮助我实现目标.谢谢.

Met*_*ark 190

从有关Formatter类的官方文档:

构造函数有两个可选参数:消息格式字符串和日期格式字符串.

所以改变

# create formatter
formatter = logging.Formatter("%(asctime)s;%(levelname)s;%(message)s")
Run Code Online (Sandbox Code Playgroud)

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

  • 请注意,如果您正在使用配置日志记录的dictConfig方法(例如,如果您使用的是Django),则可以使用格式化程序的'datefmt'dict键设置它.请参阅:[Django日志记录配置](http://docs.djangoproject.com/en/dev/topics/logging/#configuring-logging),[logging module:Dictionary Schema Details](http://docs.python.org /2/library/logging.config.html#dictionary-schema-details) (20认同)
  • 在1.9中,如果您使用的是LOGGING设置,则可以包含这样的'datefmt'条目...`'formatters':{'default':{'format':'%(asctime)s | %(levelname)s | %(模块)s | %(消息)s','datefmt':'%Y-%m-%d%H:%M',},` (8认同)
  • 此外,如果使用basicConfig配置日志记录,则需要一个名为datefmt的命名参数 (7认同)

Ben*_*Ben 116

使用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',
)
Run Code Online (Sandbox Code Playgroud)

这允许您在一行中格式化和配置所有内容.生成的日志记录如下所示:

2014-05-26 12:22:52.376 CRITICAL historylistener - main: History log failed to start
Run Code Online (Sandbox Code Playgroud)

  • 我为msecs字段添加了零填充格式.否则,小于100的msecs值显示不正确. (4认同)
  • 也就是说,OP 根本不希望出现毫秒! (3认同)
  • 要删除毫秒,只需以 --> .%(msecs)03d 格式删除它 (2认同)
  • 我最喜欢的格式:`datefmt='%0y%0m%0d_%0H%0M%0S'` (2认同)

cri*_*ton 30

如果将logging.config.fileConfig与配置文件一起使用,请使用以下内容:

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


Iac*_*hus 24

要添加到其他答案,这里是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.     
Run Code Online (Sandbox Code Playgroud)


Ama*_*mar 8

尝试这些格式:

格式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"
                    },
              }
Run Code Online (Sandbox Code Playgroud)

格式1的输出:

在此输入图像描述



格式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"
                    },
              }
Run Code Online (Sandbox Code Playgroud)

格式2的输出:

在此输入图像描述

  • 您可以添加一些代码来展示如何使用它吗? (2认同)