目录

  • 介绍
  • 快速使用
  • 基本使用
  • 封装日志工具类
  • 附录
  • 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