1.日志
1.1 日志的作用
简单总结为以下3点:
- 用于程序调试
- 了解软件程序运行情况,是否正常
- 软件程序运行故障分析与问题定位
1.2 日志的等级
不同的应用程序所定义的日志等级可能会有所差别,分的详细点的会包含以下几个等级:
DEBUG
INFO
NOTICE
WARNING
ERROR
CRITICAL
ALERT
EMERGENCY
1.3 日志信息与格式
一条日志信息对应的是一个事件的发生,而一个事件通常需要包括以下几个内容:
- 事件发生时间
- 事件发生位置
- 事件的严重程度--日志级别
- 事件内容
2.Django中的日志
2.1 日志器 Logger
日志器提供应用程序代码直接使用的接口,是整个日志系统的入口。
一个日志器设定了日志级别,只有达到这个日志级别的信息才会被日志器处理,在这个日志级别以下的信息将会被日志器忽略。当日志器处理一条达到级别的信息时,它将会把这个信息传给处理器。
Python中定义了五个日志级别(从低到高):
DEBUG
: Low level system information for debugging purposesINFO
: General system informationWARNING
: Information describing a minor problem that has occurred.ERROR
: Information describing a major problem that has occurred.CRITICAL
: Information describing a critical problem that has occurred.
2.2 处理器 Handler
处理器是日志处理的引擎,用于将日志记录发送到指定的目的位置。它决定了要将怎样的日志行为信息写入到哪里,如控制台、文件或socket端口。
同日志器一样,处理器也有日志级别,也只会处理达到设定的日志级别的信息。一个日志器可以有多个处理器,每个处理器都设定有一个日志级别。你可以给每个处理器设定不同的日志级别。
2.3 过滤器 Filter
过滤器作为日志器和处理器之间额外的控制,用于控制哪些信息应该从日志器传送到处理器。
系统默认任何达到日志级别要求的日志都会被处理,但通过增加过滤器,你可以在日志记录过程中增加额外的标准要求,以决定自己想要的日志级别。
过滤器可以被增加在日志器中或者处理器中,同时也可以增加多个过滤器形成多个过滤操作。
2.4 格式器 Formatter
一个日志记录最终需要被记录为文本,格式器用于决定这个文本的格式。一个格式器通常由包含了LogRecord attributes的Python自带的格式化字符串组成。当然,我们也可以自定义特定的格式。
常用的LogRecord Attributes有:
Attribute name | Format | Description |
---|---|---|
asctime | %(asctime)s |
Human-readable time when the LogRecord was created. By default this is of the form ‘2003-07-08 16:49:45,896’ (the numbers after the comma are millisecond portion of the time). |
filename | %(filename)s |
Filename portion of pathname . |
levelname | %(levelname)s |
Text logging level for the message ('DEBUG' , 'INFO' , 'WARNING' , 'ERROR' , 'CRITICAL' ). |
levelno | %(levelno)s |
Numeric logging level for the message (DEBUG , INFO , WARNING , ERROR , CRITICAL ). |
lineno | %(lineno)d |
Source line number where the logging call was issued (if available). |
message | %(message)s |
The logged message, computed as msg % args . This is set when Formatter.format() is invoked. |
module | %(module)s |
Module (name portion of filename ). |
pathname | %(pathname)s |
Full pathname of the source file where the logging call was issued (if available). |
process | %(process)d |
Process ID (if available). |
processName | %processName)s |
Process name (if available). |
thread | %(thread)d |
Thread ID (if available). |
threadName | %(threadName)s |
Thread name (if available). |
2.5 日志的工作流程图
3.日志的使用范例
在setting中增加日志配置,LOGGING字典中对日志器、处理器、过滤器、格式器进行配置
# 日志配置
LOGGING = {
'version': 1,
'disable_existing_loggers': False, #是否禁用日志器
#日志格式
'formatters': {
'verbose': { # 详细格式,名字可随意取
#格式: 报错等级 报错时间 模块 行号 信息
'format': '%(levelname)s %(asctime)s %(module)s %(lineno)d %(message)s'
},
'simple': { # 简单格式
'format': '%(levelname)s %(module)s %(lineno)d %(message)s'
},
},
#过滤器
'filters': {
'require_debug_true': {
'()': 'django.utils.log.RequireDebugTrue', #过滤掉调试信息
},
},
# 处理错误信息的对象
'handlers': {
# 处理错误信息的控制台对象
'console': {
'level': 'DEBUG', # DEBUG以上级别报错信息都会出现在控制台
'filters': ['require_debug_true'], # 设定过滤器
'class': 'logging.StreamHandler',
'formatter': 'verbose' # 日志格式设为详细格式
},
'file': {
# 记录INFO级别以上的报错信息
'level': 'INFO',
'class': 'logging.handlers.RotatingFileHandler',
# 日志位置,日志文件名,日志保存目录logs必须手动创建,一般创建在项目根目录下
'filename': os.path.join(os.path.dirname(BASE_DIR), "logs/luffy.log"),
# 日志文件的最大值,这里我们设置300M
'maxBytes': 300 * 1024 * 1024,
# 日志文件的数量,设置最大日志数量为10
'backupCount': 10,
# 日志格式:详细格式,日志格式在上面定义了
'formatter': 'verbose'
},
},
# 日志对象
'loggers': {
'django': { # 日志器名
# 处理对象有两个,一个conosle对象,一个file对象,这两个对象在上面的handlers中进行了定义和配置
'handlers': ['console', 'file'],
'propagate': True, # 是否让日志信息继续冒泡给其他的日志处理系统,子级向父级传播
},
}
}
在视图函数中使用日志器
import logging
logging = logging.getLogger('django')
项目运行后,将可以看到达到INFO
级别的日志信息被记录在logs目录中的luffy.log文件中
4.本文参考:
[1] Django 2.0 Logging
[2] Python Logging HOWTO
[3] Python and Django Logging in Plain English
[4] django进阶之日志功能
[5] Django 个人博客 - 日志器使用