django 日志
找了好多日志,感觉都写的不清楚,这里自己记录一下,参考了很多其他人的文章
日志级别
- DEBUG:用于调试目的的低级别系统信息
- INFO:一般的系统信息
- WARNING:描述发生的主要问题的信息
- ERROR:描述发生的主要问题的信息
- CRITICAL:描述发生的关键问题的信息
日志级别等级CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET
日志器 Logger
日志器提供应用程序代码直接使用的接口,是整个日志系统的入口。
一个日志器设定了日志级别,只有达到这个日志级别的信息才会被日志器处理,在这个日志级别以下的信息将会被日志器忽略。
# 日志对象
'loggers': {
# 日志器名
'loggersName': {
# 处理对象有两个,一个conosle对象,一个file对象,在handlers
'handlers': ['console', 'file'],
# 是否让日志信息继续冒泡给其他的日志处理系统,子级向父级传播
# propagate=False表示输出日志但不传递
# propagate=True表示输出日志,同时消息往父级传递,
'propagate': True,
},
}
当日志器处理一条达到级别的信息时,它将会把这个信息传给处理器。
处理器 Handler
处理器是日志处理的引擎,用于将日志记录发送到指定的目的位置。它决定了要将怎样的日志行为信息写入到哪里,如控制台、文件或socket端口。
同日志器一样,处理器也有日志级别,也只会处理达到设定的日志级别的信息。一个日志器可以有多个处理器,每个处理器都设定有一个日志级别。你可以给每个处理器设定不同的日志级别。
# 处理错误信息的对象
'handlers': {
'console': { # 处理错误信息的控制台对象,即我们在pycharm中看到的调试信息由此控制
'level': 'DEBUG', # DEBUG以上级别报错信息都会出现在控制台
'filters': ['require_debug_true'], # 设定过滤器
'class': 'logging.StreamHandler', # 日志处理器
'formatter': 'verbose' # 日志格式设为详细格式
},
'file': { # 处理错误信息的file对象
'level': 'INFO', # 记录INFO级别以上的报错信息
'class': 'logging.handlers.RotatingFileHandler', # 日志处理器
'filename': os.path.join(os.path.dirname(BASE_DIR), "logs/luffy.log"), # 日志位置,日志文件名,日志保存目录logs必须手动创建,一般创建在项目根目录下
'maxBytes': 300 * 1024 * 1024, # 日志文件的最大值,这里我们设置300M
'backupCount': 10, # 日志文件的数量,设置最大日志数量为10
'formatter': 'verbose' # 日志格式:详细格式,日志格式在上面定义了
},
},
过滤器 Filter
过滤器作为日志器和处理器之间额外的控制,用于控制哪些信息应该从日志器传送到处理器。
系统默认任何达到日志级别要求的日志都会被处理,但通过增加过滤器,你可以在日志记录过程中增加额外的标准要求,以决定自己想要的日志级别。
过滤器可以被增加在日志器中或者处理器中,同时也可以增加多个过滤器形成多个过滤操作。
# 过滤器
'filters': {
'require_debug_true': {
'()': 'django.utils.log.RequireDebugTrue', # 过滤掉调试信息
},
},
格式器 Formatter
一个日志记录最终需要被记录为文本,格式器用于决定这个文本的格式。一个格式器通常由包含了LogRecord attributes的Python自带的格式化字符串组成。
格式 | 描述 |
---|---|
`%(asctime)s | 时间和日,期默认格式为:2003-07-08 16:49:45,896. |
`%(filename)s | 执行日志记录调用的函数名称 |
%(levelname)s | 日志记录级别的文本名称 |
%(levelno)s | 数字形势的日志记录基本 |
%(lineno)d | 执行日志记录调用的行号 |
%(message)s | 记录的消息 |
%(module)s | 执行日志记录调用的模块名称 |
%(pathname)s | 执行日志记录调用的源文件的路径名称 |
%(process)d | 进程ID |
%(processName)s | 进程名称 |
%(thread)d | 线程ID |
%(threadName)s | 线程名称 |
# 日志格式
'formatters': {
# 详细格式,名字可随意取
'verbose': {
# 格式: 报错等级 报错时间 模块 行号 信息
'format': '%(levelname)s %(asctime)s %(module)s %(lineno)d %(message)s'
},
# 简单格式
'simple': {
'format': '%(levelname)s %(module)s %(lineno)d %(message)s'
},
},
定义日志并使用
在setting中增加日志配置
import os
# 日志文件保存地址
LOG_PATH = os.path,join(BASE_DIR,'log')
# 文件位置不存在则c
if not os.path.isdir(LOG_PATH):
os.mkdir(LOG_PATH)
# 日志配置
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': { # 处理错误信息的控制台对象,即我们在pycharm中看到的调试信息由此控制
'level': 'DEBUG', # DEBUG以上级别报错信息都会出现在控制台
'filters': ['require_debug_true'], # 设定过滤器
'class': 'logging.StreamHandler', # 日志处理器
'formatter': 'verbose' # 日志格式设为详细格式
},
'file': { # 处理错误信息的file对象
'level': 'INFO', # 记录INFO级别以上的报错信息
'class': 'logging.handlers.RotatingFileHandler', # 日志处理器
'filename': LOG_PATH+"/luffy.log"), # 日志位置,日志文件名,日志保存目录logs必须手动创建,一般创建在项目根目录下
'maxBytes': 300 * 1024 * 1024, # 日志文件的最大值,这里我们设置300M
'backupCount': 10, # 日志文件的数量,设置最大日志数量为10
'formatter': 'verbose' # 日志格式:详细格式,日志格式在上面定义了
},
},
# 日志对象
'loggers': {
# 日志器名
'django': {
'handlers': ['console', 'file'], # 处理对象有两个,一个conosle对象,一个file对象,这两个对象在上面的handlers中进行了定义和配置
'propagate': True, # 是否让日志信息继续冒泡给其他的日志处理系统,子级向父级传播
},
}
}
使用日志
import logging
logging = logging.getLogger('django')
logging.DEBUG('打印DEBUG级别日志')