日志

官方手册:

https://docs.python.org/zh-cn/3/library/logging.html

日志打印规范:

https://blog.csdn.net/liubenlong007/article/details/110262961

快速入门:

import logging
logging.basicConfig(level=logging.INFO)
logging.info('Hello World')

参见

  • 应用案例1: imapclient(v2.2.0) 库。 imapclient.py line:44。

  • 应用案例2 core

初始化basicConfig配置

logging.basicConfig只在第一次调用的时候生效。 basicConfig函数是通过logging.root.handles的元素数量来判断是否第一次调用:

logging.basicConfig(level=logging.INFO)

# 重置配置
# 日志级别改为默认值
logging.root.setLevel(logging.WARNING)
logging.root.handlers.clear()

# 重新设置
logging.basicConfig(level=logging.ERROR)

getLogger

1import logging
2
3logger = logging.getLogger(__name__)
4h = logging.StreamHandler()
5h.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(module)s:%(funcName)s - %(message)s"))
6logger.addHandler(h)
7logger.setLevel(logging.INFO)
8logger.info("message")

如果这个代码文件有可能是作为启动入口的位置,那就应该加上4-7行代码,作为第一次设置日志配置

logger.setLevel应该跟logger.addHandler搭配使用,只调用setLevel是没有效果的。

基础

  • [便利函数](#便利函数)

  • [记录日志到文件](#记录日志到文件)

  • [日志级别](#日志级别)

  • 其他

进阶

  • [记录器](#Logger)(暴露了应用程序代码直接使用的接口)

  • [处理程序Handler](#处理程序)(将日志记录发送到适当的目标)
    • SMTPHandler日志发送邮件

  • 格式化程序Formatter(指定最终输出中日志记录的样式)

  • 过滤器(提供更精细的附加功能,用于确定要输出的日志记录)

  • 配置日志记录

  • LogRecord属性


记录日志到文件

import logging
logging.basicConfig(filename='example.log', encoding='utf-8', level=logging.DEBUG,
                    format=' %(asctime)s - %(levelname)s- %(message)s',
                    datefmt='%m%d%Y%I:%M%S%p')
logging.debug('This message should go to the log file')
logging.info('So should this')
logging.warning('And this, too')
logging.error('And non-ASCII stuff, too, like Øresund and Malmö')

对 basicConfig() 的调用应该在 debug() , info() 等的前面。因为它被设计为一次性的配置,只有第一次调用会进行操作,随后的调用不会产生有效操作。

如果多次运行上述脚本,则连续运行的消息将追加到文件 example.log 。 如果你希望每次运行重新开始,而不是记住先前运行的消息,则可以通过将上例中的调用更改为来指定 filemode 参数:

import logging
logging.basicConfig(filename='example.log', filemode='w', level=logging.DEBUG)

禁用日志

logging.disble()函数禁用了这些消息,这样就不必进入到程序中,手工删除所有日的日志调用。 只要向logging.disble()传入一个日志级别,它就会禁止该级别和更低级别的所有日志消息。所以,如果想 要禁用所有日志,只要在程序中添加logging.disable(logging.CRITICAL)。

记录器

创建

import logging
logger = logging.getLogger('name')

警告

直接实例化: logger = logging.Logger('name') 是错误的做法

配置

  • Logger.setLevel()指定记录器将处理的最低严重性日志消息。

  • Logger.addHandler()和Logger.removeHandler()从记录器对象中添加和删除处理程序对象。

  • Logger.addFilter()和Logger.removeFilter()可以添加或移除记录器对象中的过滤器。

处理程序Handler

SMTPHandler

该实例使用电子邮件的发件人、收件人地址和主题行进行初始化。 toaddrs 应当为字符串列表。 要指定一个非标准 SMTP 端口,请使用 (host, port) 元组格式作为 mailhost 参数。 如果你使用一个字符串,则会使用标准 SMTP 端口。 如果你的 SMTP 服务器要求验证,你可以指定一个 (username, password) 元组作为 credentials 参数。

要指定使用安全协议 (TLS),请传入一个元组作为 secure 参数。 这将仅在提供了验证凭据时才能被使用。 元组应当或是一个空元组,或是一个包含密钥文件名的单值元组,或是一个包含密钥文件和证书文件的 2 值元组。 (此元组会被传给 smtplib.SMTP.starttls() 方法。):

import logging
import logging.handlers

logger = logging.Logger('email')

logger.setLevel(logging.WARNING)

eh = logging.handlers.SMTPHandler(mailhost=('smtp.exmail.qq.com',587),
                                  fromaddr='username',toaddrs=['username'],
                                  subject = 'logging测试',credentials= ('username','pwd'),
                                  secure =tuple(),timeout=300)

# 处理程序处理级别
eh.setLevel(logging.ERROR)
logger.addHandler(eh)

logger.warning('警告消息1')

# 发送邮件
logger.error('错误消息1')
# 发送第二封邮件
logger.error('错误消息2')

Django配置日志

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
        },
    },
    # 根日志器的配置。
    'root': {
        'handlers': ['console'],
        'level': 'WARNING',
    },
    'loggers': {
        'django': {
            'handlers': ['console'],
            'level': os.getenv('DJANGO_LOG_LEVEL', 'INFO'),
            # 是否广播给父日志器, 默认为广播到logger.root, root的配置的效果被触发。
            'propagate': False,
        },
    },
}