日志等级
日志等级(level):DEBUG/INFO/WARNING/ERROR/CRITICAL
开发和部署时可以使用DEBUG或INFO级别的日志获取尽可能详细的日志信息来进行开发和部署调试;应用上线或部署生产环境,应该使用更高级别的日志来降低机器的I/O压力。
使用方式
- 使用logging提供的模块级别函数
- 使用logging日志系统的四大组件
模块级别常用函数:
logging.debug()
、logging.info()
、logging.warning()
、logging.error()
、logging.critical()
、logging.log()
、logging.basicConfig()
这些函数可以直接拿来调用,默认是使用root logger进行日志输出,其中logging.log()
创建一条严重级别的日志,logging.basicConfig()
是对root logger()进行一次性(多次配置不会产生作用)配置,包括要记录的日志级别、日志格式、日志输出位置、日志文件的打开模式等信息。
另外,日志器(Logger)是有层级关系的,上面调用的logging模块级别的函数所使用的日志器是RootLogger类的实例,其名称为root,它是处于日志器层级关系最顶层的日志器,且该实例是以单例模式存在的。
示例:
import logging
logging.debug("This is a debug log.")
logging.info("This is a info log.")
logging.warning("This is a warning log.")
logging.error("This is a error log.")
logging.critical("This is a critical log.")
# 默认的日志格式是:
# 日志级别:日志器名称:日志内容
LOG_FORMAT = "%(asctime)s - %(levelname)s - %(message)s"
logging.basicConfig(filename='my.log', level=logging.DEBUG, format=LOG_FORMAT)
format格式:
字段/属性名称 | 使用格式 | 描述 |
---|---|---|
asctime | %(asctime)s | 日志事件发生的时间–人类可读时间,如:2003-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 | 进程名称,Python 3.1新增 |
thread | %(thread)d | 线程ID |
threadName | %(thread)s | 线程名称 |
四大组件:
组件名称 | 对应类名 | 功能描述 |
---|---|---|
日志器 | Logger | 提供了应用程序可一直使用的接口 |
处理器 | Handler | 将logger创建的日志记录发送到合适的目的输出 |
过滤器 | Filter | 提供了更细粒度的控制工具来决定输出哪条日志记录,丢弃哪条日志记录 |
格式器 | Formatter | 决定日志记录的最终输出格式 |
其中日志器就将日志信息输出到目标位置,处理器就是指定输出位置的,日志器可以设置多个处理器将同一日志输出到不同的位置,每个处理器都可以设置自己的过滤器实现日志过滤,每个处理器也可以设置格式器。
即日志器(logger)是入口,真正干活儿的是处理器(handler),处理器(handler)还可以通过过滤器(filter)和格式器(formatter)对要输出的日志内容做过滤和格式化等处理操作。
示例:
import logging
import colorlog
logging.basicConfig(level=logging.ERROR)
my_logger = logging.getLogger(__name__)
my_logger.setLevel(logging.DEBUG)
stream_handler = logging.StreamHandler()
formatter = colorlog.ColoredFormatter(
"%(log_color)s%(levelname)1.1s %(asctime)s %(reset)s| %(message_log_color)s%(levelname)-8s %(reset)s| %("
"log_color)s[%(filename)s%(reset)s:%(log_color)s%(module)s%(reset)s:%(log_color)s%(funcName)s%("
"reset)s:%(log_color)s%(""lineno)d] %(reset)s- %(white)s%(message)s",
reset=True,
log_colors={
'DEBUG': 'cyan',
'INFO': 'green',
'WARNING': 'yellow',
'ERROR': 'red',
'CRITICAL': 'red',
},
secondary_log_colors={
"message": {
"DEBUG": "blue",
"INFO": "blue",
"WARNING": "blue",
"ERROR": "red",
"CRITICAL": "bold_red"
}
},
style="%"
) # 日志输出格式
stream_handler.setFormatter(formatter)
my_logger.addHandler(stream_handler)
my_logger.propagate = False # 关闭向父logger传递,避免重复输出