Python之logging日志
Python中的logging模块,功能强大,非常方便调试输出。Django也使用了Python自带的logging模块作为日志打印工具。本文简单介绍下logging模块的使用方法,以及如何在Django中使用。
1、简介
logging模块定义的函数和类为应用程序和库的开发实现了一个灵活的事件日志系统。logging模块是Python的一个标准库模块,由标准库模块提供日志记录API的关键好处是所有Python模块都可以使用这个日志记录功能。
logging是线程安全的,主要功能由4部分组成:
| 组件 | 功能 |
|---|---|
| Logger | 用户使用的直接接口,将日志传递给Handler |
| Handler | 控制日志输出到哪里,console,file… ,一个logger可以有多个Handler; |
| Filter | 控制哪些日志可以从logger流向Handler |
| Formatter | 控制日志的格式 |
2、最简单的使用方法
最简单的使用方法为“两步走”方式,1)导入模块,2)记录日志内容,多用于输出一个简单的日志内容。此时日志将按照默认格式输出。默认格式为:"%(levelname)s:%(name)s:%(message)s"。如果希望改变日志格式,可以调用basicConfig函数完成。 1
2
3
4
5
6
7
8# 最简使用方法
import logging
#改变默认日志格式
logging.basicConfig(level=logging.INFO,
format='[%(threadName)-9s(%(lineno)d)] %(message)s')
logging.info('log内容')basicConfig函数中level参数控制日志输出级别(即Filter)。logging模块中定义的日志级别有5个,
| 日志级别(level) | 描述 |
|---|---|
| logging.DEBUG | 最详细的日志信息,典型应用场景是 问题诊断 |
| logging.INFO | 信息详细程度仅次于DEBUG,通常只记录关键节点信息,用于确认一切都是按照我们预期的那样进行工作 |
| logging.WARNING | 当某些不期望的事情发生时记录的信息(如,磁盘可用空间较低),但是此时应用程序还是正常运行的 |
| logging.ERROR | 由于一个更严重的问题导致某些功能不能正常运行时记录的信息 |
| logging.CRITICAL | 当发生严重错误,导致应用程序不能继续运行时记录的信息 |
basicConfig函数所有参数如下表所示:
| 参数名称 | 描述 | 常用 |
|---|---|---|
| filename | 指定日志输出目标文件的文件名,指定该设置项后日志就不会被输出到控制台了 | |
| filemode | 指定日志文件的打开模式,默认为追加模式('a')。该选项在filename指定时才有效 |
|
| format | 指定日志格式字符串,即指定日志输出时所包含的字段信息以及它们的顺序。 | |
| datefmt | 指定日期/时间格式。仅在format中包含时间字段%(asctime)s时才有效 |
|
| level | 指定日志器的日志级别 | |
| stream | 指定日志输出目标流,多指向控制台。 | |
| style | 指定format格式字符串的风格,可取值为'%'、'{'和'$',默认为'%' |
|
| handlers | 该选项应是包含多个Handler的可迭代对象,这些Handler将会被添加到root logger。 |
注意:filename、stream和handlers这三个参数仅能取其一,不能同时出现,否则会引发ValueError异常。
3、标准使用方法
在basicConfig函数进行完整参数配置,已经接近标准logging模块的使用方法。logging模块的标准使用方法,包括自定义上述4个组件,控制日志的格式、级别及输出对象等。
1 | import logging |
logging模块中,Formatter可使用的预定义格式化字符串如下表:
| 字段/属性名称 | 使用格式 | 描述 |
|---|---|---|
| asctime | %(asctime)s | 日志事件发生的时间,如:2018-07-08 16:49:45,896 |
| created | %(created)f | 日志事件发生的时间--时间戳,即调用time.time()函数返回的值 |
| relativeCreated | %(relativeCreated)d | 日志事件发生的时间相对于logging模块加载时间的相对毫秒数(一般不用) |
| msecs | %(msecs)d | 日志事件发生事件的毫秒部分 |
| levelname | %(levelname)s | 日志日志级别名称('DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL') |
| levelno | %(levelno)s | 数字形式的日志级别(10, 20, 30, 40, 50) |
| name | %(name)s | 日志器名称,默认是'root',因为默认使用的是 rootLogger |
| message | %(message)s | 日志记录的文本内容,通过 msg % args计算得到的 |
| pathname | %(pathname)s | 调用日志记录函数的源码文件的全路径 |
| filename | %(filename)s | pathname的文件名部分,包含文件后缀 |
| module | %(module)s | filename的名称部分,不包含后缀 |
| lineno | %(lineno)d | 调用日志记录函数的源代码所在的行号 |
| funcName | %(funcName)s | 调用日志记录函数的函数名 |
| process | %(process)d | 进程ID |
| processName | %(processName)s | 进程名称 |
| thread | %(thread)d | 线程ID |
| threadName | %(thread)s | 线程名称 |
logging模块中,预定义的Handler下表:
| Handler | 描述 |
|---|---|
| logging.StreamHandler | 将日志消息发送到输出到Stream,如std.out, std.err或任何file-like对象。 |
| logging.FileHandler | 将日志消息发送到磁盘文件,默认情况下文件大小会无限增长 |
| logging.handlers.RotatingFileHandler | 将日志消息发送到磁盘文件,并支持日志文件按大小切割 |
| logging.hanlders.TimedRotatingFileHandler | 将日志消息发送到磁盘文件,并支持日志文件按时间切割 |
| logging.handlers.HTTPHandler | 将日志消息以GET或POST的方式发送给一个HTTP服务器 |
| logging.handlers.SMTPHandler | 将日志消息发送给一个指定的email地址 |
| logging.NullHandler | 该Handler实例会忽略error messages,通常被想使用logging的library开发者使用来避免'No handlers could be found for logger XXX'信息的出现。 |
4、Django中日志模块的使用
1)项目里setting.py里配置
Django通过在settings文件中使用LOGGING来定制日志输出(包括定义logger, handler, formatter等)
例如,settings文件中定义如下:
1 | BASE_LOG_DIR = os.path.join(BASE_DIR, "log") |
2)views.py里使用
1 | import logging |