Python——logging模块

logging 模块

日志级别

1
2
3
4
5
logging.debug()		# 10     # 默认级别为warning
logging.info() # 20 # 默认输出位置为控制台
logging.warning() # 30 # 默认编码根据系统确定
logging.error() # 40
logging.critical() # 50

自定义配置

1
2
import logging
logging.basicConfig() # 函数中通过具体参数来更改logging模块默认行为
  • 可用参数
1
2
3
4
5
6
filename: 用指定的文件名创建FiledHandler,这样日志会被储存在指定的文件
filemode: 文件打开方式,在指定了filename时使用这个参数,默认值为'a'还可以指定'w'
format: 指定handler使用的日志显示格式
datefmt: 指定日期时间格式
level: 设置rootlogger的日志级别
stream: 用指定的stream创建StreamHandler,可以指定输出到sys.stderr, sys.stdout或者文件,默认为sys.stderr。若同时列出了filename和stream两个参数,则stream参数会被忽略。
  • 可用格式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
%(name)s:  Logger的名字,并非用户名,详细查看
%(levelno)s: 数字形式的日志级别
%(levelname)s: 文本形式的日志级别
%(pathname)s: 调用日志输出函数的模块的文件名
%(module)s: 调用日志输出函数的模块名
%(funcName)s: 调用日志输出函数的函数名
%(lineno)d: 调用日志输出函数的语句所在的代码行
%(created)f: 当前时间,用UNIX标准的表示时间的浮点数表示
%(relativeCreated)d: 输出日志信息时自Logger创建以来的毫秒数
%(asctime)s: 字符串形式的当前时间。默认格式为'2018-10-15 17:30:00,123'在逗号后边是毫秒
%(thread)d: 线程ID
%(threadName)s: 线程名
%(process)d: 进程ID
%(message)s: 用户输出的消息
Case
1
2
3
4
5
6
7
8
9
10
11
import logging
logging.basicConfig(
filename="a.log",
filemode="at",
level=10,
format="%(asctime)s %(levelname)s %(funcName)s %(lineno)s %(message)s",
datefmt="%Y-%m-%d %X %p"
)
logging.debug("这是调试信息")
# 由于我们设置了最低级别从10开始所以debug信息也会显示
# 2018-10-18 18:19:21 PM DEBUG <module> 21 这又是调试信息

logging中的四个核心角色

  • logger 生成日志
  • handler 处理日志
  • filter 过滤日志
  • formatter 格式化

一条日志完整的生命周期

  • 由logger产生日志 # 会先检查日志级别,低于设置的级别则不执行
  • 交给过滤器判断是否被过滤
  • 将日志消息分发给绑定的所有处理器
  • 处理器按照绑定的格式化对对象输出日志 # 如果不指定格式则按照默认格式

通过字典配置日志模块

配置日志模块

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
42
43
44
45
46
47
standard_format = "%(name)s %(asctime)s %(levelname)s %(module)s %(funcName)s %(lineno)s %(message)s"
simple_format = "%(name)s %(asctime)s %(module)s %(message)s"
complete_format = "%(asctime)s %(levelname)s %(funcName)s %(lineno)s %(thread)s %(process)s %(message)s"
logfile_path = r"/Users/ooc/Desktop/代码/test/log0.log"

LOGGING_DIC = {
'version':1,
'formatters':{
'standard': {
'format' : standard_format
},
'simple':{
'format' : simple_format
},
'complete':{
'format' : complete_format
}
},
'fileters':{},
'handlers' :{
'console' :{
'level' : 'DEBUG',
'class' : 'logging.StreamHandler',
'formatter' : 'simple'
},
'default':{
'level': 'DEBUG',
'class': 'logging.handlers.RotatingFileHandler',
'formatter': 'standard',
'filename': logfile_path, #
'maxBytes': 1024 * 1024 * 5,
# 日志文件的最大大小为5M 超出后 换文件
'backupCount': 5, # 最多留五个日志文件
'encoding': 'utf-8',
},
},
'logger' :{
# 在getLogger的时候 如果指定的名称 不存在 或者不给名称 用的就是默认的
# 在这里如果key为空 它就是默认的
# 你可以自己定义生成器的名称 并且他们还能使用相同的默认配置
'': {
'handlers': ['default', 'console'],
'level': 'DEBUG',
'propagate': False,
},
},
}