· 日志对于Web应用的作用就像飞机的黑匣子,用于记录Web应用的运行状态,方便开发者快速定位错误并进行修复。

· python中内置的 logging模块功能全面,web应用集成日志功能基本都是基于该模块。

1. 基本使用

· logging模块提供了默认日志,只需要通过basicConfig()函数就可以快速配置

· logging模块提供了多个日志级别: 致命错误CRITICAL /错误ERROR /警告WARNING /信息INFO /调试DEBUG,方便开发者提供需求进行日志过滤。

代码示例

import logging

def basic_log():

"""使用默认日志

缺点: 文件输出/控制台输出 二选一"""

format = "%(name)s %(levelname)s %(pathname)s %(lineno)d %(message)s"

# 设置默认日志

logging.basicConfig(level="DEBUG", format=format, filename='basic.log')

# 使用默认日志

logging.debug('this is a debug message')

logging.info('this is a info message')

logging.warning('this is a warn message')

logging.error('this is a error message')

if __name__ == '__main__':

basic_log()

· 注意点:

默认日志的缺点是文件输出/控制台输出只能二选一

2. 自定义日志器

· 自定义日志器可以添加多个输出处理器, 将日志同时输出到 控制台 & 文件 & 邮件 等环境中

· 自定义日志器的基本使用步骤:

(1)创建/获取自定义日志器

(2)创建输出处理器

(3)日志器添加处理器

(4)使用自定义日志

import logging

from logging.handlers import RotatingFileHandler

def custem_log():

"""使用自定义日志 可以同时在控制台和文件输出"""

# 创建/获取自定义的日志器

mylogger = logging.getLogger('mylogger')

# 设置全局级别

mylogger.setLevel('DEBUG')

# 创建控制台处理器

console_handler = logging.StreamHandler()

# 给处理器设置输出格式

console_formatter = logging.Formatter(fmt='%(name)s %(levelname)s %(pathname)s %(lineno)d %(message)s')

console_handler.setFormatter(console_formatter)

# 日志器添加处理器

mylogger.addHandler(console_handler)

# 创建文件处理器

file_handler = RotatingFileHandler(filename='mylogger.log', maxBytes=100 * 1024 * 1024, backupCount=10) # 转存文件处理器 当达到限定的文件大小时, 可以将日志转存到其他文件中

# 给处理器设置输出格式

file_formatter = logging.Formatter(fmt='[%(asctime)s] %(name)s %(levelname)s %(pathname)s %(lineno)d %(message)s')

file_handler.setFormatter(file_formatter)

# 单独设置文件处理器的日志级别

file_handler.setLevel('WARN')

# 日志器添加处理器

mylogger.addHandler(file_handler)

# 使用自定义日志

mylogger.debug('this is a debug message')

mylogger.info('this is a info message')

mylogger.warning('this is a warn message')

mylogger.error('this is a error message')

if __name__ == '__main__':

custem_log()

3. 邮件发送日志

· 项目上线后,开发者往往不会持续关注所有的日志信息,为了更快的发现和解决错误,比较常规的一种方式是将一般或者高级别的错误写入电子邮件并发送给开发者。

· logging模块可以配置一个SMTPHandler邮件输出处理器来实现该需求

代码示例

import logging

from logging.handlers import SMTPHandler

def mail_log():

"""使用邮件输出日志, 将日志以邮件形式发送"""

# 创建/获取自定义的日志器

mylogger = logging.getLogger('mylogger')

# 设置全局级别

mylogger.setLevel('DEBUG')

# 创建邮件处理器

mail_handler = SMTPHandler(

mailhost=('smtp.163.com', 25), # SMTP称为简单邮件传输协议, 163提供了支持该协议的邮件服务器, 端口为25

fromaddr='czbk_zzz@163.com', # 发件人地址

toaddrs=['xxx@itcast.cn', 'xx@qq.com'], # 收件人地址

subject='Log Error',

credentials=('czbk_zzz@163.com', 'HZLLPADWYUWUVDIQ') # 发件人的邮件地址 和 发件人的授权密码

)

# 给处理器设置输出格式

mail_formatter = logging.Formatter(fmt='%(name)s %(levelname)s %(pathname)s %(lineno)d %(message)s')

mail_handler.setFormatter(mail_formatter)

# 设置邮件处理器的日志级别

mail_handler.setLevel('ERROR')

# 日志器添加处理器

mylogger.addHandler(mail_handler)

# 使用自定义日志

mylogger.debug('this is a debug message')

mylogger.info('this is a info message')

mylogger.warning('this is a warn message')

mylogger.error('this is a error message')

if __name__ == '__main__':

mail_log()

发送邮件是耗时操作,可以考虑使用celery执行异步任务,提高响应速度。