在 python 项目中如何记录日志

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在 python 项目中如何记录日志相关的知识,希望对你有一定的参考价值。

参考技术A

写本文的目的是我在写 python 项目的时候需要记录日志,我忘记怎么处理了,每次都需要去网上查一遍, 好记性不如烂笔头 , 这里把查阅的内容记录下来,方便以后查找。

python 项目中记录日志,可以使用 logging 模块,logging 模块定义的函数和类为应用程序和库的开发实现了一个灵活的事件日志系统。logging 模块是Python的一个标准库模块,由标准库模块提供日志记录API的关键好处是所有Python模块都可以使用这个日志记录功能。所以,你的应用日志可以将你自己的日志信息与来自第三方模块的信息整合起来。

在 __init__.py 文件中做如下配置:

控制台输出日志如下:

参考文档
https://www.cnblogs.com/yyds/p/6901864.html

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

【中文标题】如何自定义 Python 日志记录的时间格式?【英文标题】:How to Customize the time format for Python logging? 【发布时间】:2011-03-14 07:30:56 【问题描述】:

我是 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,但很困惑。感谢您为实现我的目标所提供的帮助。谢谢。

【问题讨论】:

【参考方案1】:

试试这些格式:

格式 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 的输出:

格式 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 的输出:

【讨论】:

【参考方案2】:

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

【讨论】:

我为毫秒字段添加了零填充格式。否则,小于 100 的毫秒值会出现错误。 也就是说,OP 根本不希望毫秒出现! 要删除毫秒,只需在格式中删除它 --> .%(msecs)03d【参考方案3】:

要添加到其他答案,这里是 Python 文档中的 variable list。

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.     

【讨论】:

奇怪。我想要一个自定义日期格式,但我想包括微秒(或者是毫秒?)。 %S 的意思是“作为十进制数”,但根据我的实验,它打印为整数(没有小数部分)。【参考方案4】:

来自official documentation 关于 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")

【讨论】:

请注意,如果您使用 dictConfig 配置日志记录的方法(例如,如果您使用 Django),您可以使用格式化程序的 'datefmt' dict 键进行设置。见:Django Logging Configuration,logging module: Dictionary Schema Details 另外,如果您使用 basicConfig 配置日志记录,它需要一个名为 datefmt 的命名参数 在 1.9 中,如果您使用的是 LOGGING 设置,您可以像这样包含一个 'datefmt' 条目...'formatters': 'default': 'format': '%(asctime)s | %(levelname)s | %(module)s | %(message)s', 'datefmt': '%Y-%m-%d %H:%M', , 时区是什么? @Luv33preet 它的'%z'【参考方案5】:

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

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

【讨论】:

以上是关于在 python 项目中如何记录日志的主要内容,如果未能解决你的问题,请参考以下文章

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

如何剥离 Python 日志记录调用而不将它们注释掉?

在 Python Django 中启用调试时,如何仅关闭 SqlAlchemy 数据库池的日志记录?

如何在 Ray 中使用 python 日志记录?

如何在 Python Django 中运行单元测试时禁用日志记录?

如何在Python日志记录中的GMT / UTC上设置时间戳?