日志模块-logging
# logging模块输出日志
# 导入模块
- import logging
- 日志记录程序运行过程中的关键信息,非常重要不能轻易的删除
# 按日志级别输出日志
- 越往下级别越高,触发条件也应当越严格
# 记录调试级别日志
logging.debug('调试日志信息')
10
调试级别 -- 在程序开发调试时用
# 记录消息级别日志
logging.info('信息日志信息')
20
消息级别 -- 正常运行的输出信息
# 记录警告级别日志
logging.warning('警告日志信息')
30
警告级别 -- 现在运行没问题、但是以后可能出现错误的警告信息
# 记录错误级别日志
logging.error('错误日志信息')
40
错误级别 -- 程序已经出现错误的信息
# 记录灾难级别日志
logging.critical('灾难日志信息')
50
灾难级别 -- 发生的错误非常严重、可能会导致程序的全面崩溃的信息
# 配置logging模块的基本设置
# logging.basecConfig(基本配置)
- 了解即可,一般用配置字典来进行配置
- 例如
- logging.basecConfig(filename='...',format='...',datefmt='...')
# 日志输出位置
filename='日志文件路径'
- 不指定则只输出到终端屏幕
- 指定了则只输出到文件
# 日志格式
format='%(asctime)s - %(name)s - %(levelname)s - %(module)s: %(message)s'
%(asctime)s
-- 调用日志函数时的格式化时间%(name)s
-- 日志文件名称%(levelname)s
-- 日志级别%(levelname)s
-- 调用日志函数的模块名%(funcName)s
-- 调用日志函数的函数名%(lineno)d
-- 调用日志函数的代码行数%(message)s
-- 用户输出的消息
# 时间格式
datefmt='%Y-%m-%d %H:%M:%S %p'
# 日志输出级别
level=30
- 默认是30,也就是warning级别
- 表示只有warning及以上级别的日志,才会被输出
# logging日志配置字典
# 一般写到配置文件或模块中
# 配置字典
LOGGING_DIC = {
'version': 1.0,
'disable_existing_loggers': False,
'formatters': {
'日志格式名1': {'format': '日志格式'},
'日志格式名2': {'format': '日志格式'}
},
'handlers': {
# 输出到屏幕
'日志处理方式名1': {
# 可数字、也可是大写的级别名
'level': '日志级别',
# logging.StreamHandler表示指定输出到屏幕
'class': 'logging.StreamHandler',
# formatters中配置的格式名
'formatter': '日志格式名'
# 输出到文件
'日志处理方式名2': {
'level': '日志级别',
# logging.FileHandler表示指定输出到文件
'class': 'logging.FileHandler',
'formatter': '日志格式名',
# 指定输出日志的文件路径
'filename': '日志文件路径',
# 指定输出到文件的编码格式
'encoding': '编码格式'
}},
}
'loggers': {
# logger名
'日志名1': {
# 日志输出位置,可指定多个
'handlers': [handler名1, handler名2],
# 在这里会先过滤一次,到handlers又会过滤一次
'level': '日志级别',
# 默认为True会向上级传递,通常关闭使日志更独立
'propagate': False
},
'日志名2': {... ...}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
disable_existing_loggers
- 是否禁用已经存在的logger实例
- 一般设为False即可
formatters
- 指定日志格式,日志格式内容一般可以用变量传入,方便修改
handlers
- 日志输出位置
loggers
- 产生日志并传递给handlers
- 大多数日志都是传输到一个文件,除非特殊场景
# logging配置字典的使用
# 导入模块
- from logging import config, getLogger
# 导入日志配置字典
config.dictConfig(LOGGING_DIC)
# 获得指定的logger对象
logger01 = getLogger('logger名')
# 发送对应级别的日志到logger所对应的handler
logger01.日志级别('日志信息')
- 例如
logger01.info('This is a info log!')
# logger日志名命名
# 日志名是区分日志业务功能种类的一种非常重要的标识
# 例如
userTrade
- 用户交易相关的日志,logger名就应当与其相关
# 代码冗余问题
- 一类下的相关业务又可能非常多,而其中的logger配置又一样,这就会造成代码冗长
- 这个时候,可以创建一个空日志名的logger
- 这样在我们生成logger对象时,如果指定的日志名没有在loggers下找到,就会使用默认的""下的配置
- 但日志记录的日志名,会是我们实例化时传入的名字
# logging日志轮转
# 介绍
- 日志文件会随着时间越来越大,为了防止日志文件过大造成打开文件过慢且占用内存多
- 就需要日志轮转,也就是将日志按大小或者时间进行分割,分割成多个日志文件
- 超过大小后,会将日志文件以前的内容,全部剪切到日志切割文件,然后将新内容写入日志文件
# 设置方法
- handlers -- 日志输出位置中
'handlers': {
'日志处理方式名': {
'level': '日志级别',
# 保存到文件并进行日志轮转
'class': 'logging.handlers.RotatingFileHandler',
'formatter': '日志格式名',
'filename': '日志文件路径',
'encoding': '编码格式',
# 日志文件最大字节大小,此处是5M
'maxBytes': 1024*1024*5,
# 分割的日志文件最大保留数量,超过则最早的将被删除
'backupCount': 10
}}
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13