针对参考中的几项添加一些内容,可以现用的log功能。(其中会有两种颜色标识,颜色表示部分参考fast-reid)。
此处代码主要参考:参考2与参考3。由于前面写得太好,这里将两者结合。非常感谢几位作者(Runner1st,caoxinyiyi,L1aoXingyu)。
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,重复打印问题的解决方案