python关于logger在工程中的使用(区分颜色)

针对参考中的几项添加一些内容,可以现用的log功能。(其中会有两种颜色标识,颜色表示部分参考fast-reid)。

此处代码主要参考:参考2与参考3。由于前面写得太好,这里将两者结合。非常感谢几位作者(Runner1stcaoxinyiyiL1aoXingyu)。

0.环境

python3.6
termcolor

1.logger的封装

这里主要是参考2与参考3结合,两处修改:

(1)添加了颜色区分;(2)命令行中输出设置为logging.DEBUG级别。基础部分参考1。

# -*- coding: UTF-8 -*-
'''
@author: mengting gu
@contact: 1065504814@qq.com
@time: 2020/11/5 下午6:03
@file: log.py
@desc: 
'''

#!/usr/bin/python
# -*- coding:utf-8 -*-

import logging
import time
import os
from termcolor import colored

class _ColorfulFormatter(logging.Formatter):
    def __init__(self, *args, **kwargs):
        self._root_name = kwargs.pop("root_name") + "."
        self._abbrev_name = kwargs.pop("abbrev_name", "")
        if len(self._abbrev_name):
            self._abbrev_name = self._abbrev_name + "."
        super(_ColorfulFormatter, self).__init__(*args, **kwargs)

    def formatMessage(self, record):
        record.name = record.name.replace(self._root_name, self._abbrev_name)
        log = super(_ColorfulFormatter, self).formatMessage(record)
        if record.levelno == logging.WARNING:
            prefix = colored("WARNING", "red", attrs=["blink"])
        elif record.levelno == logging.ERROR or record.levelno == logging.CRITICAL:
            prefix = colored("ERROR", "red", attrs=["blink", "underline"])
        else:
            return log
        return prefix + " " + log

class Log(object):
    '''
封装后的logging
    '''

    def __init__(self, logger=None, color=True, name="pedescount", log_cate='search', abbrev_name = None):
        '''
            指定保存日志的文件路径,日志级别,以及调用文件
            将日志存入到指定的文件中
        '''

        # 创建一个logger
        self.logger = logging.getLogger(logger)
        self.logger.setLevel(logging.DEBUG)
        # 创建一个handler,用于写入日志文件
        self.log_time = time.strftime("%Y_%m_%d")
        # file_dir = os.getcwd() + '/../log'
        file_dir = os.getcwd() + '/log' #当前工作目录下的log文件夹
        if not os.path.exists(file_dir): 
            os.mkdir(file_dir)
        self.log_path = file_dir
        self.log_name = self.log_path + "/" + log_cate + "." + self.log_time + '.log'
        # print(self.log_name)

        # fh = logging.FileHandler(self.log_name, 'a')  # 追加模式  这个是python2的
        fh = logging.FileHandler(self.log_name, 'a', encoding='utf-8')  # 这个是python3的
        fh.setLevel(logging.DEBUG)

        # 再创建一个handler,用于输出到控制台
        ch = logging.StreamHandler()
        ch.setLevel(logging.DEBUG)

        # 定义handler的输出格式
        # formatter = logging.Formatter(
        #     '[%(asctime)s] %(filename)s->%(funcName)s line:%(lineno)d [%(levelname)s]%(message)s')
        plain_formatter = logging.Formatter(
            "[%(asctime)s] %(filename)s %(levelname)s: %(message)s", datefmt="%m/%d %H:%M:%S")
        if color:
            formatter = _ColorfulFormatter(
                colored("[%(asctime)s] %(filename)s %(levelname)s: ", "green") + "%(message)s",
                datefmt="%m/%d %H:%M:%S",
                root_name=name,
                abbrev_name=str(abbrev_name),
            )
        else:
            formatter = plain_formatter
        fh.setFormatter(formatter)
        ch.setFormatter(formatter)

        # 给logger添加handler
        self.logger.addHandler(fh)
        self.logger.addHandler(ch)

        #  添加下面一句,在记录日志之后移除句柄
        # self.logger.removeHandler(ch)
        # self.logger.removeHandler(fh)
        # 关闭打开的文件
        fh.close()
        ch.close()

    def getlog(self):
        return self.logger

2.在工程中使用log.info

from src.common.log import Log
log = Log(__name__).getlog()
log.info("sort the file")

3.在工程中使用log.error

from src.common.log import Log
log = Log(__name__).getlog()
try:
    #      
except:
    log.error("Unexpected error:", sys.exc_info()[0])
    log.error("do not found blob file")

4.关于保存的文件.log或.txt

下面的路径可以自己设置,我的是工作目录下的log文件夹(这里由于代码中工作目录有调整,路径略微复杂,暂不详细说明)。

file_dir = os.getcwd() + '/log' #当前工作目录下的log文件夹
self.log_path = file_dir
self.log_name = self.log_path + "/" + log_cate + "." + self.log_time + '.log'

由于我的文件句柄与控制台句柄的日志级别设置的都是一样的。

fh = logging.FileHandler(self.log_name, 'a', encoding='utf-8')  # 这个是python3的
fh.setLevel(logging.DEBUG)
# 再创建一个handler,用于输出到控制台
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)

所以保存到日志的应该和命令行输出的应该是一样的。以第一个log.info为例:

 

参考

1.python + logging 实现日志输出及保存到文件

2.python中多个文件共用logger,重复打印问题的解决方案

3.fast-reid/blob/master/fastreid/utils/logger.py

4.python错误和异常

5.Python 中 logging 模块的基本用法

6.Python之日志处理(logging模块)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wait a minutes

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值