python实现自定义日志,支持同时输出到屏幕和文件


日志相信大家都不陌生,不管是开发还是测试运维,多多少少应该都接触过日志。当然啦,软件出问题后,日志是定位问题最有效的手段之一,这就要求有一个好的日志格式,今天分享的就是用python实现自己的日志。

自定义日志类

如下是一个用python实现的日志类
Logger.py

import logging


class Logger(object):
    level_relations = {
        'debug': logging.DEBUG,
        'info': logging.INFO,
        'warn': logging.WARNING,
        'error': logging.ERROR,
        'fatal': logging.FATAL
    }

    def __init__(self, filename, level='info', fmt='[%(asctime)s - %(levelname)s] - %(message)s'):
        self.logger = logging.getLogger()
        self.logger.setLevel(self.level_relations[level])

        # 设置日志输出格式
        formatter = logging.Formatter(fmt)
        # 写入日志文件
        fh = logging.FileHandler(filename)
        fh.setFormatter(formatter)
        # 输出到屏幕
        screen = logging.StreamHandler()
        screen.setFormatter(formatter)

        # add handler to logger
        self.logger.addHandler(fh)
        self.logger.addHandler(screen)

日志级别

debug级别最低,从debug到fatal,日志级别越来越高,fatal级别最高。当设置日志级别为其中某个(如INFO)时,比它级别低的日志(DEBUG)不会输出。
在这里插入图片描述
在这里插入图片描述

使用自定义日志类

1)直接使用

直接将日志类放在python源文件中,如:

import logging


class Logger(object):
    level_relations = {
        'debug': logging.DEBUG,
        'info': logging.INFO,
        'warn': logging.WARNING,
        'error': logging.ERROR,
        'fatal': logging.FATAL
    }

    def __init__(self, filename, level='info', fmt='[%(asctime)s - %(levelname)s] - %(message)s'):
        self.logger = logging.getLogger()
        self.logger.setLevel(self.level_relations[level])

        # 设置日志输出格式
        formatter = logging.Formatter(fmt)
        # 写入日志文件
        fh = logging.FileHandler(filename)
        fh.setFormatter(formatter)
        # 输出到屏幕
        screen = logging.StreamHandler()
        screen.setFormatter(formatter)

        # add handler to logger
        self.logger.addHandler(fh)
        self.logger.addHandler(screen)


if __name__ == '__main__':
    log = Logger('test.log', level='info')
    log.logger.info('Test for log')

在这里插入图片描述

2)日志类作为模块使用

推荐使用这种方式,将日志和其他部分的代码分开,降低耦合性。

你可能使用如下的目录结构,将日志类单独放在log目录下,在其他地方如main.py中使用
在这里插入图片描述
注意,log目录下除了日志类,还多了一个__init__.py,如果没有该文件,使用import导入Logger模块时,会报错日志模块无法调用。

在python中,__init__py标识了一个目录是python中的包(package),这意味着你可以使用import语句来导入这个目录中的模块或包。‌
该文件中的内容也非常简单
在这里插入图片描述
至此,已经可以在外部使用log目录下的日志类。

单独写一个main.py:

# main.py
from log import Logger


if __name__ == '__main__':
    log = Logger('test.log', level='info')
    log.logger.info('Test for log')

此时,你也可以把日志模块(log目录)拷贝到Linux下使用,
在这里插入图片描述

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值