目录
- 介绍
- 快速使用
- 基本使用
- 封装日志工具类
- 附录
- Format格式说明
介绍
logging模块是Python内置的标准模块,主要用于输入运行日志,可以设置输出日志的等级,日志保存路径等。
快速使用
# 导入logging包
import logging
# 设置配置信息
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s")
# 定义日志的名称
logger = logging.getLogger("日志V1")
# 打印相关的日志信息
# info
logger.info("这个一个info的信息")
#debug
logger.debug("这是一个debug的信息")
# warning
logger.warning("这是一个warning的信息")
基本使用
日志输出控制台或文件
import logging
# 1.设置logger名称
logger =logging.getLogger("log_file")
# 2.设置log级别
logger.setLevel(logging.INFO)
# 3.创建handler,用于输出控制台或写入日志文件
fh_stream = logging.StreamHandler() # 控制台的handler
fh_file = logging.FileHandler("test.log", encoding="utf8") # 日志文件的handler
# 4.设置控制台或写入日志文件的日志级别
fh_stream.setLevel(logging.WARNING) # 控制台的日志级别
fh_file.setLevel(logging.DEBUG) # 日志文件的日志级别
# 5.定义handler的输入格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh_stream.setFormatter(formatter) # 控制台的日志格式
fh_file.setFormatter(formatter) # 日志文件的日志格式
# 6.添加handler
logger.addHandler(fh_stream)
logger.addHandler(fh_file)
# 7.运行输出
logger.info("这是info的信息")
logger.debug("这是debug的信息")
logger.warning("这是warning的信息")
- 最后的由于
logger.setLevel(logging.INFO)
已经限制了日志的最大级别为INFO, 因此debug的信息是不会输出到控制台或文件中 - 同理, 由于控制台的日志级别
fh_stream.setLevel(logging.WARNING)
已经设置为warning, 因此info级别的日志不会输出到控制台 - 日志级别排序:
Debug>Info>Warning>Error>Critical
封装日志工具类
import logging
import datetime
import os
# 定义日志级别的映射
log_l = {
"info": logging.INFO,
"debug": logging.DEBUG,
"warning": logging.WARNING,
"error": logging.ERROR
}
# 1. 创建类
class Logger:
# 2. 定义参数: 写入日志文件的名称test.log, logger名称, 日志级别总开关
def __init__(self, log_file, log_name, log_level):
self.logger = logging.getLogger(log_name) # 设置logger名称
self.logger.setLevel(log_l[log_level]) # 通过映射关系设置日志级别
# 3. 编写控制台handler
if not self.logger.handlers: # 判断当前是否有handler,如果没有才创建handler
fh_stream = logging.StreamHandler()
fh_stream.setLevel(log_l[log_level])
formatter = logging.Formatter('%(asctime)s - %(name)s -%(lineno)s - %(levelname)s - %(message)s')
fh_stream.setFormatter(formatter)
self.logger.addHandler(fh_stream)
# 4. 编写输出日志文件handler
fh_file = logging.FileHandler(log_file)
fh_file.setLevel(log_l[log_level])
fh_file.setFormatter(formatter)
self.logger.addHandler(fh_file)
# 设置logs目录
log_path = os.path.dirname(__file__) # 获取当前路径
log_path = log_path + os.path.sep + "logs" # 拼接logs路径
current_data = datetime.datetime.now().strftime("%Y-%m-%d") # 其获取当前时间
log_file = os.path.join(log_path, current_data + ".log") # 拼接为完整路径
# print(log_file)
# 定义日志级别
loglevel = "info"
# 初始化log工具类, 提供给其他类使用
def my_log(log_name=__file__):
return Logger(log_file, log_name, loglevel).logger
if __name__ == '__main__':
log = my_log("实例化工具类时定义名称")
log.info("这是一个info信息")
附录
Format格式说明
-
%(asctime)s
: 打印日志的时间 -
%(name)s
: 打印logger名称 -
%(levelname)s
: 打印日志级别名称 -
%(message)s
: 打印日志信息 -
%(levelno)s
: 打印日志级别的数值 -
%(pathname)s
: 打印当前执行程序的路径, 其实就是sys.argv[0] -
%(filename)s
: 打印当前执行程序名 -
%(funcName)s
: 打印日志的当前函数 -
%(lineno)s
: 打印日志的当前行号 -
%(thread)s
: 打印线程ID -
%(threadName)s
: 打印线程名称 -
%(process)s
:打印进程ID