首页 > 编程语言 > 详细

Python log 日志

时间:2020-07-13 15:28:54      阅读:60      评论:0      收藏:0      [点我收藏+]

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")

 

Python log 日志

原文:https://www.cnblogs.com/clearheart/p/13293062.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!