一、日志等级
    Debug : 打印全部的日志,详细的信息,通常只出现在诊断问题上
    Info : 打印info,warning,error,critical级别的日志,确认一切按预期运行
    Warning : 打印warning,error,critical级别的日志,一个迹象表明,一些意想不到的事情发生了,或表明一些问题在不久的将来(例如,磁盘空间低),这个软件还能按预期工作
    Error : 打印error,critical级别的日志,更严重的问题,软件没能执行一些功能
    Critical : 打印critical级别,一个严重的错误,这表明程序本身可能无法继续运行
    级别排序:CRITICAL > ERROR > WARNING > INFO > DEBUG
    在控制台输出日志

    1. import logging
    2. logging.basicConfig(level=logging.INFO) # 通过basicConfig设置日志级别
    3. logging.debug("这是一条 debug 等级的日志")
    4. logging.info("这是一条 info 等级的日志")
    5. logging.warning("这是一条 warning 等级的日志")
    6. logging.error("这是一条 error 等级的日志")
    7. logging.critical("这是一条 critical 等级的日志")
    8. INFO:root:这是一条 info 等级的日志
    9. WARNING:root:这是一条 warning 等级的日志
    10. ERROR:root:这是一条 error 等级的日志
    11. CRITICAL:root:这是一条 critical 等级的日志

    运行上述代码,在控制台分别回显了 INFO 、WARNING、ERROR、CRITICAL级别的日志,是因为在日志配置函数basicConfig( ) 中 level = logging.INFO,等级低于 INFO 的 DEBUG 日志不会被记录,而等级等于或高于 INFO 的日志都会被记录

    二、logging中常用方法
    1、logging.Formatter: 这是一个配置日志格式的类,自定义日志按何种样式记录和展示;
    2、logger = logging.getLogger( ): 生成一个logging模块的主体,为程序提供记录日志的接口,并根据日志级别把对应日志分发给不同 handler;
    3、logging.FileHandler( ): 把日志记录输出到文件
    4、logging.StreamHandler( ): 把日志记录输出出控制台
    5、logger.setLevel( ): 设置总的日志级别
    6、logger.addHandler( ): 添加一个Handler (FileHandler、StreamHandler)
    7、Handler.setLevel( ): 设置handler 的日志级别
    8、Handler.setFormatter( ): 设置handler 的输出格式

    三、Formatter常用格式:

    1. %(levelno)s: 打印日志级别的数值
    2. %(levelname)s: 打印日志级别名称
    3. %(pathname)s: 打印当前执行程序的路径
    4. %(filename)s: 打印当前执行程序名
    5. %(funcName)s: 打印日志的当前函数
    6. %(lineno)d: 打印日志的当前行号
    7. %(asctime)s: 打印日志的时间
    8. %(thread)d: 打印线程ID
    9. %(threadName)s: 打印线程名称
    10. %(process)d: 打印进程ID
    11. %(message)s: 打印日志信息

    四、把日志输出到控制台

    1. import logging
    2. logger = logging.getLogger()
    3. logger.setLevel(logging.INFO)
    4. ch = logging.StreamHandler() # 输出日志到控制台
    5. ch.setLevel(logging.INFO) # 输出到控制台的日志等级
    6. # 定义日志handler的输出格式
    7. fmt = logging.Formatter('%(asctime)s - %(filename)s:[%(lineno)s] - [%(levelname)s] - %(message)s')
    8. ch.setFormatter(fmt)
    9. logger.addHandler(ch)
    10. logger.info("这是一个 INFO 日志")
    11. # 2021-06-30 10:29:46,043 - study02.py:[15] - [INFO] - 这是一个 INFO 日志

    1、首先通过getLogger( ) 创建一个logging的主体对象logger,供程序调用;
    2、通过 setLevel( ) 设置日志总的等级;
    3、创建一个Handler对象ch,streamHandler 为输出日志到控制台;
    4、为这个Handler实例ch 通过setLevel 设定输出到控制台的日志等级;
    5、通过Formatter定义日志的输出格式fmt;
    6、通过调用Handler的setFormatter把fmt对象作为参数传入来定义输出到控制台的日志格式;
    7、调用logger.addHandler把Handler对象ch添加到logger主体中;

    五、把日志输出到文件

    1. import logging
    2. import time
    3. import os
    4. logger = logging.getLogger()
    5. logger.setLevel(logging.INFO)
    6. currTime = time.strftime("%Y-%m-%d")
    7. log_py_path = os.path.abspath(__file__) # 当前py文件的绝对路径,会定位到对应py文件
    8. log_dir_path = os.path.split(log_py_path)[0] # 当前py文件的文件夹路径
    9. pro_path = os.path.dirname(log_dir_path) # 当前py文件对应文件夹的上层目录路径
    10. Log_path = pro_path + '/Logs/'
    11. log_name = Log_path + currTime + '.log'
    12. fh = logging.FileHandler(file_path, mode='a') # mode = 'a' 为在原日志上追加,'w'为覆盖 输出日志到文件
    13. fh.setLevel(logging.INFO) # 输出到 file 的日志等级
    14. # 定义日志handler的输出格式
    15. fmt = logging.Formatter('%(asctime)s - %(filename)s:[%(lineno)s] - [%(levelname)s] - %(message)s')
    16. fh.setFormatter(fmt)
    17. logger.addHandler(fh)
    18. logger.info("这是一个 INFO 日志")

    1、首先通过getLogger( ) 创建一个logging的对象主体logger,供程序调用;
    2、通过 setLevel( ) 设置日志总的等级;
    3、time.strftime(“%Y-%m-%d”) 获取当地时间按(年-月-日);
    4、os.path.abspath(os.getcwd( )) 获取当前工作目录的绝对路径;
    5、创建一个Handler对象fh,FileHandler 为输出日志到文件;
    6、为这个Handler对象fh 通过setLevel 设定输出到文件的日志等级;
    7、通过Formatter定义日志的输出格式fmt;
    8、通过调用Handler的setFormatter把fmt对象作为参数传入来定义输出到控制台的日志格式;
    9、调用logger.addHandler把Handler对象ch添加到logger主体中;

    封装一个日志类

    1. import logging
    2. import time
    3. import os
    4. class Logger:
    5. def __init__(self, name, logger_level='INFO', stream_level='INFO', file_level='INFO'):
    6. # 创建一个 logger
    7. self.__logger = logging.getLogger(name)
    8. # 设置Log等级总开关
    9. self.__logger.setLevel(logger_level)
    10. # 创建 handler,用于日志写入
    11. currTime = time.strftime("%Y-%m-%d") # 获取日期年-月-日
    12. log_py_path = os.path.abspath(__file__) # 当前py文件的绝对路径,会定位到对应py文件
    13. log_dir_path = os.path.split(log_py_path)[0] # 当前py文件的文件夹路径
    14. pro_path = os.path.dirname(log_dir_path) # 当前py文件对应文件夹的上层目录路径
    15. Log_path = pro_path + '\\Logs\\'
    16. log_name = Log_path + currTime + '.log'
    17. fh = logging.FileHandler(log_name, mode='a') # mode = 'a' 为在原日志上追加,'w'为覆盖 输出日志到文件
    18. fh.setLevel(file_level) # 输出到 file 的日志等级
    19. ch = logging.StreamHandler() # 输出日志到控制台
    20. ch.setLevel(stream_level) # 输出到控制台的日志等级
    21. # 定义日志handler的输出格式
    22. fmt = logging.Formatter('%(asctime)s - %(filename)s:[%(lineno)s] - [%(levelname)s] - %(message)s')
    23. fh.setFormatter(fmt)
    24. ch.setFormatter(fmt)
    25. # 添加 logger 到 handler里面
    26. self.__logger.addHandler(fh)
    27. self.__logger.addHandler(ch)
    28. def get_logger(self):
    29. return self.__logger