1、logging 日志文件 简单处理一下,规避一些小麻烦,比如 info级别会记录error内容 ,处理后 info 只记录info error只记录error ,并且可以对需要特殊处理的日志单独记录
2、简单封装,name为日志名字,对应需要不同处理的日志,起不相同的名字,logpath日志路径,名字不同路径也需要不同,比如 A.py 文件要区别整体日志,可单出初始化针对于A.py文件的日志命名和相关路径
import logging from logging import Logger from logging.handlers import TimedRotatingFileHandler, RotatingFileHandler import os, sys class Log(object): ‘‘‘ 自定义日志 ‘‘‘ ERROR = 40 WARNING = 30 INFO = 20 DEBUG = 10 def __init__(self, name=None, logpath=‘log‘, level=ERROR): ‘‘‘ :param name: 日志名称 :param logpath: 日志相对路径文件夹 :param level: 日志级别 com_log_parent_path: 获得d所在的目录,即d的父级目录 com_log_path:获得parent_path所在的目录即parent_path的父级目录 ‘‘‘ com_log_parent_path = os.path.dirname(os.path.abspath(__file__)) com_log_path = os.path.dirname(com_log_parent_path) self.__name = name self.__path = "{0}/{1}".format(com_log_path, logpath) self.__error = None self.__warning = None self.__info = None self.__debug = None # 创建路径 isExists = os.path.exists(self.__path) if not isExists: os.makedirs(self.__path) if (logging.ERROR <= level): _path = "{0}/{1}.log".format(self.__path, ‘ERROR‘) self.__error = self.__baselog(logpath + ‘ERROR‘, logging.ERROR, _path, 1) if (logging.WARNING <= level): _path = "{0}/{1}.log".format(self.__path, ‘WARNING‘) self.__warning = self.__baselog(logpath + ‘WARNING‘, logging.WARNING, _path, 1) if (logging.INFO <= level): _path = "{0}/{1}.log".format(self.__path, ‘INFO‘) self.__info = self.__baselog(logpath + ‘INFO‘, logging.INFO, _path, 1) if (logging.DEBUG <= level): _path = "{0}/{1}.log".format(self.__path, ‘DEBUG‘) self.__debug = self.__baselog(logpath + ‘DEBUG‘, logging.DEBUG, _path, 1) def record(self, level, text): try: f = sys._getframe().f_back # f = sys.exc_info()[2].tb_frame.f_back except: f = sys._getframe() _filename = str(f.f_code.co_filename).split("/")[-1] # 记录日志触发模块文件 _fuc = str(f.f_code.co_name) # 触发日志的方法 _line = str(f.f_lineno) # 触发日志的位置 第几行 text = "[{0}:{1}:{2}]:{3}".format(_filename, _fuc, _line, text) if (logging.ERROR == level): if (self.__error): self.__error.error(text) if (logging.WARNING == level): if (self.__warning): self.__warning.warning(text) if (logging.INFO == level): if (self.__info): self.__info.info(text) if (logging.DEBUG == level): if (self.__debug): self.__debug.debug(text) # 封装实例 def __baselog(self, logger_name, level, path, size): """ 日志管理类型 :param logger_name: 日志名字 *** 用来给日志分类,不同类日志 分别记录 每一个类型值需初始化一次 :param level: 日志级别 *** 记录日志的等级 :param path: 文件存储路径 :param size: 日志文件分割大小 单位 Mb :return: """ logger = None if logger_name not in Logger.manager.loggerDict: # 这句话在控制台输出结果 正式使用 最好注销 如果用nohup 方式启动程序 控制台输出信息会记录到nohup 文件下 冗余信息 文件过大 # logging.basicConfig() # 按文件大小拆分 # handler = logging.handlers.RotatingFileHandler(path, maxBytes=1024 * 1024 * size, backupCount=7, # encoding=‘utf-8‘) # 按天拆分 handler = logging.handlers.TimedRotatingFileHandler(path, when="D", interval=1, backupCount=7, encoding=‘utf-8‘) fmt = ‘[%(asctime)s]:%(message)s.‘ # 日志输出的格式 formatter = logging.Formatter(fmt) # 设置格式 handler.setFormatter(formatter) logger = logging.getLogger(logger_name) # 设置日志名称 logger.addHandler(handler) # 添加刚设置的handler logger.setLevel(level) # 设置级别为info以上记录到日志 return logger
3、初始化
# 1、默认项目根目录下 Log文件夹 # 全局初始化 com_log = Log() # 2、单独设置命名和路径 # 全局初始化 com_A_log = Log("日志命名","日志路径",记录的日志级别) ** 日志级别 只用了四中,Debug,Info,Waring和Error,记录日志级别为Error 则四种都可以记录,为Info 则记录Debug和Info 默认值是Error
4、调用,第一个参数记录级别,第二个参数记录内容,内容不需要特殊处理 时间,模块,方法,行数已经在内封装好 每个级别的日志单独记录 Info里不会在重复记录Error级别的内容
com_log.record(com_log.ERROR, "ERROR") com_log.record(com_log.INFO, "INFO") com_log.record(com_log.DEBUG, "DEBUG") com_log.record(com_log.WARNING, "DEBUG")
原文:https://www.cnblogs.com/clearheart/p/13293062.html