python import logging日志(日志封装)详解

Written by

in

文章目录
  • 如何使用python自带的 logging 模块实现日志功能
  • 以上为个人经验,希望能给大家一个参考,也希望大家多多支持风君子博客。 您可能感兴趣的文章: Python中日志模块logging的最佳实践指南 Python多线程日志错乱之logging.Handler并发问题解决 Python中logging模块用法示例总结 python进阶之logging日志模块的使用 Python logging模块使用示例详解 Python日志模块Logging使用指北(最新推荐)
  • 目录
    • 创建日志类并使用
      • 初始化一个logger对象
        • 1)引入模块
        • 2)初始化变量,声明logger对象
        • 3) 生成路径
        • 4)指定logger输出格式
        • 5)指定日志文件的输出级别
        • 6) 自动分割日志文件
      • 输入日志内容
        • 开源日志实例
          • 多日志输出实例
          • 总结

            如何使用python自带的 logging 模块实现日志功能

            import os
            import logging
            import sys

            LOG_PATH = 'logs'   #设置log路径
            LOG_FILE = 'text.txt'    #设置log文件名
            
            #设置根路径为起始位置
            logger = logging.getLogger(__name__)

            #生成log指定路径
            
            if os.path.exists(LOG_PATH):
                pass
            else:
                os.mkdir(LOG_PATH)

                formatter = logging.Formatter('%(asctime)s %(levelname)-8s: %(message)s')
                
                file_handler = logging.FileHandler("%s/%s" % (LOG_PATH, LOG_FILE))
                
                # 可以通过setFormatter指定输出格式
                file_handler.setFormatter(formatter)
                
                logger.addHandler(file_handler)

            分为如下几个级别:

            _nameToLevel = {
                'CRITICAL': CRITICAL,
                'FATAL': FATAL,
                'ERROR': ERROR,
                'WARN': WARNING,
                'WARNING': WARNING,
                'INFO': INFO,
                'DEBUG': DEBUG,
                'NOTSET': NOTSET,
            } 

            使用setLevel函数指定输出级别 指定之后将只显示级别以上的日志类型

            logger.setLevel(logging.DEBUG)

            python 提供了两个处理器,方便我们分割文件:

            • logging.handlers.RotatingFileHandler -> 按照大小自动分割日志文件,一旦达到指定的大小重新生成文件
            • logging.handlers.TimedRotatingFileHandler -> 按照时间自动分割日志文件

            TimedRotatingFileHandler(filename='logs/info/' +
                                      info_file_name,
                                      when='MIDNIGHT',
                                      interval=1,
                                      backupCount=7,
                                      encoding='utf-8')
            
            # filename:日志文件名
            # when:日志文件按什么维度切分。'S'-秒;'M'-分钟;'H'-小时;'D'-天;'W'-周
            #       这里需要注意,如果选择 D-天,那么这个不是严格意义上的'天',而是从你
            #       项目启动开始,过了24小时,才会从新创建一个新的日志文件,
            #       如果项目重启,这个时间就会重置。所以这里选择'MIDNIGHT'-是指过了午夜
            #       12点,就会创建新的日志。
            # interval:是指等待多少个单位 when 的时间后,Logger会自动重建文件。
            # backupCount:是保留日志个数。默认的0是不会自动删除掉日志。
            

            when是一个字符串用于描述滚动周期的基本单位,字符串的值及意义如下:

            • 'S': Seconds
            • 'M': Minutes
            • 'H': Hours
            • 'D': Days
            • 'W': Week day (0=Monday)
            • 'midnight': Roll over at midnight
            • interval: 滚动周期,单位有when指定,比如:when='D',interval=1,表示每天产生一个日志文件;
            • backupCount: 表示日志文件的保留个数

            #输出debug类型日志
            logger.debug("debug")
            
            #多参数传递  输入info类型日志
            pam= "dshck"
            pam2="cxjkdhc"
            logger.info("%s%s"%(pam,pam2))

            log.py 代码如下

            import os
            import logging
            from logging.handlers import TimedRotatingFileHandler
            import datetime
            import json
            
            LOG_PATH = "log"
            LOG_INFO = '_info.log'
            LOG_ERROR = '_error.log'
            
            
            class logger:
                def __init__(self,prefix_name = "flask"):
                    if os.path.exists(LOG_PATH):
                        pass
                    else:
                        os.mkdir(LOG_PATH)
                    self.prefix = prefix_name
                    self.info_logger = logging.getLogger("info")
                    self.error_logger = logging.getLogger("error")
                    self.format = logging.Formatter('[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s]
            [%(filename)s:%(lineno)d]' '[%(levelname)s] : %(message)s')
                    #指定文件位置文件名以及输出格式
                    info_file_handler = logging.FileHandler("%s/%s%s" % (LOG_PATH, prefix_name,LOG_INFO))
                    info_file_handler.setFormatter(self.format)
                    error_file_handler = logging.FileHandler("%s/%s%s" % (LOG_PATH, prefix_name,LOG_ERROR))
                    error_file_handler.setFormatter(self.format)
                    self.info_logger.addHandler(info_file_handler)
                    self.error_logger.addHandler(error_file_handler)
                    # 指定日志的最低输出级别
                    self.info_logger.setLevel(logging.NOTSET)
                    self.error_logger.setLevel(logging.ERROR)
            
                def debug(self, msg, *args, **kwargs):
                    self.info_logger.debug(msg, *args, **kwargs)
            
                def info(self, msg, *args, **kwargs):
                    self.info_logger.info(msg, *args, **kwargs)
            
                def warn(self, msg, *args, **kwargs):
                    self.info_logger.warning(msg, *args, **kwargs)
            
                def warning(self, msg, *args, **kwargs):
                    self.info_logger.warning(msg, *args, **kwargs)
            
                def error(self, msg, *args, **kwargs):
                    self.error_logger.error(msg, *args, **kwargs)
            
                def fatal(self, msg, *args, **kwargs):
                    self.error_logger.fatal(msg, *args, **kwargs)
            
                def critical(self, msg, *args, **kwargs):
                    self.error_logger.critical(msg, *args, **kwargs)
            
            
            # log =logger()
            # log.info("jdshskh")
            # log.error("hdskck")
            # log.debug("1122debug")
            # log.warn("warn")
            # log.warning("warning")
            # log.critical("critical")
            # log.fatal("fatal")
            
            log =logger("celery")
            log.info("jdshskh")
            log.error("hdskck")
            log.debug("1122debug")
            log.warn("warn")
            log.warning("warning")
            log.critical("critical")
            log.fatal("fatal")

            import logging
            
            
            logger = logging.getLogger()
            
            
            def setup_logging(logfile, verbose):
                """
                设置日志记录到日志文件/控制台。
                :param logfile:要写入日志的文件的路径。
                :param verbose:如果为true,则启用详细日志记录。
                """
                root_logger = logging.getLogger()
            
                default_formatter = logging.Formatter('%(asctime)-15s (%(name)s) %(filename)s[line:%(lineno)d] : %(message)s')
            
                if verbose:
                    loglevel = logging.DEBUG
                else:
                    loglevel = logging.INFO
                root_logger.setLevel(loglevel)
            
                console_log = logging.StreamHandler()
                console_log.setLevel(loglevel)
                console_log.setFormatter(default_formatter)
                root_logger.addHandler(console_log)
            
                if logfile in ('/dev/log', '/dev/syslog', '/var/run/syslog', '/var/run/log'):
                    file_log = logging.handlers.SysLogHandler(address=logfile, facility='local1')
                    syslog_formatter = logging.Formatter('beeswarm[%(process)d]: %(message)s')
                    file_log.setFormatter(syslog_formatter)
                else:
                    file_log = logging.FileHandler(logfile)
                    file_log.setFormatter(default_formatter)
                file_log.setLevel(loglevel)
                root_logger.addHandler(file_log)
            
                # 日志按天自动创建
                """
                time_rotating_file_handler = handlers.TimedRotatingFileHandler(filename=logfile, when='S')
                #time_rotating_file_handler.setLevel(logging.ERROR)
                time_rotating_file_handler.setLevel(logging.INFO)
                time_rotating_file_handler.setFormatter(default_formatter)
                root_logger.addHandler(time_rotating_file_handler)
                """
            
            
            if __name__ == '__main__':
                setup_logging(args.logfile, args.verbose)
            
                logger.info('Initializing BeeSwarm version {0}'.format(beeswarm.version))
                logger.debug('workdir = {0}, config = {1}, customize = {2}, clear_db = {3}, reset_password = {4}, max_sessions = {5}, start_webui = {6}.'.format(args.workdir,
            config, args.customize, args.clearsessions, args.resetpw, args.max_sessions, not args.no_webui))
                logger.debug('workdir = {0}'.format())
                logger.error(...)
                logger.warning(...)

            配置文件log_config.py

            # -*- coding: utf-8 -*-
            import os
            import time
            import logging.config
            
            cur_path = os.path.dirname(os.path.realpath(__file__))  # log_path是存放日志的路径
            log_path = os.path.join(os.path.dirname(cur_path), 'logs')
            if not os.path.exists(log_path):
                os.mkdir(log_path)  # 如果不存在这个logs文件夹,就自动创建一个
            
            
            def setp_log():
                LOGGING_CONFIG = {
                    'version': 1,
                    'disable_existing_loggers': False,
                    'formatters': {
                        # 日志格式
                        'simple': {
                            'format': '[%(asctime)s] [%(levelname)s] [%(pathname)s -- %(funcName)s:%(lineno)s] [%(message)s]'},
                        # 简单格式
                        'standard': {
                            #'format': '[%(asctime)s] [%(levelname)s] [%(pathname)s -- %(funcName)s:%(lineno)s] [%(message)s]'
                            'format': '[%(asctime)s] [%(filename)s:%(lineno)s] [%(message)s]'
                        },
                    },
                    # 定义具体处理日志的方式
                    'handlers': {
                        # 控制台输出
                        'console_handler': {
                            'level': 'DEBUG',
                            'class': 'logging.StreamHandler',
                            'formatter': 'simple'
                        },
                        # 默认记录所有日志,按日期滚动输出到文件
                        'info_handler': {
                            'level': 'INFO',
                            'class': 'logging.handlers.RotatingFileHandler',
                            'filename': os.path.join(log_path, 'all-{}.log'.format(time.strftime('%Y-%m-%d'))),  # 按日分类
                            'maxBytes': 1024 * 1024 * 5,  # 文件大小
                            'backupCount': 5,  # 备份数
                            'formatter': 'standard',  # 输出格式
                            'encoding': 'utf-8',  # 设置默认编码,否则打印出来汉字乱码
                        },
                        # 输出错误日志
                        'error_handler': {
                            'level': 'ERROR',
                            'class': 'logging.handlers.RotatingFileHandler',
                            'filename': os.path.join(log_path, 'error-{}.log'.format(time.strftime('%Y-%m'))),  # 按月分类
                            'maxBytes': 1024 * 1024 * 5,  # 文件大小
                            'backupCount': 5,  # 备份数
                            'formatter': 'standard',  # 输出格式
                            'encoding': 'utf-8',  # 设置默认编码
                        },
            
                    },
                    'loggers': {
                        'log': {
                            'handlers': ['console_handler', 'info_handler', 'error_handler'],
                            'level': 'INFO',
                            'propagate': True
                        },
                    }
                }
                logging.config.dictConfig(LOGGING_CONFIG)

            测试代码

            aaa.py(加载)

            # -*- coding: utf-8 -*-
            
            from log_config import setp_log
            setp_log()
            
            
            import logging
            logger = logging.getLogger('log')
            
            logger.info("asdasd")
            logger.error("asd")

            bbb.py(调用)

            import logging
            logger = logging.getLogger('log')
            
            logger.info("asdasd")
            logger.critical("asd123")
            logger.error("asd")

            以上为个人经验,希望能给大家一个参考,也希望大家多多支持风君子博客。

            您可能感兴趣的文章:

            • Python中日志模块logging的最佳实践指南
            • Python多线程日志错乱之logging.Handler并发问题解决
            • Python中logging模块用法示例总结
            • python进阶之logging日志模块的使用
            • Python logging模块使用示例详解
            • Python日志模块Logging使用指北(最新推荐)

            站内搜索