PYTHON - logging模块

文章目录

  • logging模块
    • 设置日志级别
    • 配置格式
    • 日志写入文件
    • 模块化组件
    • 封装示例

logging模块

python标准库自带的日志模块

设置日志级别

需要导入日志模块

import logging

Logging 中几种级别:DEBUG < INFO < WARNING < ERROR < CRITICAL

日志等级 描述
DEBUG 调试信息通常在诊断问题的时候用得着
INFO 普通信息认程序按照预期运行
WARNING 警告信息表示发生意想不到的事情或者指示接下来可能会出现一些问题但是程序还是继续运行
ERROR 错误信息程序运行中出现了一些问题程序某些功能不能执行
CRITICAL 危险信息一个严重的错误导致程序无法继续运行
#设置日志级别  注意大写
logging.basicConfig(level=logging.INFO)
# debug调试信息
logging.debug('this is debug')
# 普通信息
logging.info('this is debug')
# 警告信息
logging.warning('this is debug')
# 错误信息
logging.error('this is debug')
# 危险信息
logging.critical('this is critical')
#当级别不够INFO等级的,不会提示

配置格式

格式 描述
%(asctime)s 日志事件发生的时间
%(levelname)s 该日志记录的日志级别
%(message)s 日志记录的文本内容
**%(name)s 所使用的日志器名称,默认是’root’
%(pathname)s 调用日志记录函数的文件的全路径
%(filename)s 调用日志记录函数的文件
%(funcName)s 调用日志记录函数的函数名
%(lineno)d 调用日志记录函数的代码所在的行号
logging.basicConfig(level=logging.INFO,format ='时间:%(asctime)s  日志级别:%(levelname)s  日志内容:%(message)s 行数:%(lineno)d')

日志写入文件

logging.basicConfig(level = logging.INFO,                 #写入的级别
                    format='%(asctime)s,%(filename)s,%(lineno)s', #写入文件的格式
                    filename='jiuchengdebug.log',         #写入文件的文件名
                   	filemode='a+')                        #写入的模式

模块化组件

logging模块还提供了模块化组件的方法来灵活配置日志记录器

组件 说明
Loggers(日志记录器) 提供程序直接使用的接口
Handlers(日志处理器) 将记录的日志发送到指定的位置
Filters(日志过滤器) 用于过滤特定的日志记录
Formatters(日志格式器) 用于控制日志信息的输出格式

流程如下

import logging

# 创建一个logger
my_logger = logging.getLogger('test_log')
# 设置级别
my_logger.setLevel(logging.DEBUG)
# 定义handler
# 在控制台输出
my_handCmd = logging.StreamHandler()
my_handCmd.setLevel(logging.DEBUG)

# 在文件中显示
my_handFile = logging.FileHandler('ftest.log', encoding='utf-8',mode='a+')
my_handFile.setLevel(logging.DEBUG)

# 格式化输出
Cmdformatter = logging.Formatter(
    '时间:%(asctime)s,'
    '日志级别:%(levelname)s'
    '日志消息:%(message)s'
)
Fileformatter = logging.Formatter('时间:%(asctime)s,日志级别:%(levelname)s,日志内容:%(message)s,行数:%(lineno)d')

# 以什么样的格式输出
my_handCmd.setFormatter(Cmdformatter)
my_handFile.setFormatter(Fileformatter)

# 将logger添加到handle里面
my_logger.addHandler(my_handCmd)
my_logger.addHandler(my_handFile)

#使用
# debug调试信息
my_logger.debug('this is debug')
# 普通信息
my_logger.info('this is debug')
# 警告信息
my_logger.warning('this is debug')
# 错误信息
my_logger.error('this is debug')
# 危险信息
my_logger.critical('this is critical')

#以上代码就实现了一个同时在控制台输出日志信息和文件写入日志信息的日志管理器

封装示例

import logging


class My_logger:
    def __init__(self,log_name,log_level = logging.DEBUG,log_file = 'myfile.log'):
        """
        :param log_name: 日志名称
        :param log_level:日志级别
        :param log_file:日志文件名
        """
        self.logger_name = log_name
        self.logger_lever = log_level
        self.logger_file = log_file


    #创建logger对象
    def create_Logger(self):
        my_logger = logging.getLogger(self.logger_name)
        my_logger.setLevel(self.logger_lever)
        #创建文件处理器
        my_handFile = logging.FileHandler(self.logger_file, encoding='utf-8', mode='a+')
        my_handFile.setLevel(self.logger_lever)
        #创建控制台处理器,在控制台输出
        my_handCmd = logging.StreamHandler()
        my_handCmd.setLevel(self.logger_lever)
        # 设置输出格式
        Cmd_formatter = logging.Formatter('时间:%(asctime)s,'
                                          '日志级别:%(levelname)s,'
                                          '消息文件:%(filename)s,'
                                          '日志内容:%(message)s,'
                                          '行数:%(lineno)d。'
                                          '\r\n\n')
        File_formatter = logging.Formatter('时间:%(asctime)s,'
                                           '日志级别:%(levelname)s,'
                                           '消息文件:%(filename)s,'
                                           '日志内容:%(message)s,'
                                           '行数:%(lineno)d。'
                                           '\r\n\n')
        # 以什么样的格式输出,将格式添加到处理器中
        my_handCmd.setFormatter(Cmd_formatter)
        my_handFile.setFormatter(File_formatter)
        # 将handle添加到logger里面
        my_logger.addHandler(my_handCmd)
        my_logger.addHandler(my_handFile)
        #返回创建的logger对象
        return my_logger


if __name__ == '__main__':
    log = My_logger('my',logging.DEBUG).create_Logger()
    try:
        print(a)
    except Exception as e:
        log.debug(e)

你可能感兴趣的:(Python学习,logging,python)