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

 更新时间:2026年01月17日 09:12:36   作者:墨痕诉清风  
文章介绍了如何使用Python的logging模块创建和配置日志类,包括初始化logger对象、设置日志级别和格式、自动分割日志文件等,还展示了如何在多个文件中使用日志功能,并通过配置文件进行日志配置

创建日志类并使用

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

初始化一个logger对象

1)引入模块

import os
import logging
import sys

2)初始化变量,声明logger对象

LOG_PATH = 'logs'   #设置log路径
LOG_FILE = 'text.txt'    #设置log文件名

#设置根路径为起始位置
logger = logging.getLogger(__name__)

3) 生成路径

#生成log指定路径

if os.path.exists(LOG_PATH):
    pass
else:
    os.mkdir(LOG_PATH)

4)指定logger输出格式

    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)

5)指定日志文件的输出级别

分为如下几个级别:

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

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

logger.setLevel(logging.DEBUG)

6) 自动分割日志文件

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 Scala函数与访问修辞符实例详解

    python Scala函数与访问修辞符实例详解

    这篇文章主要为大家介绍了python Scala函数与访问修辞符实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • Python+Appium实现自动化清理微信僵尸好友的方法

    Python+Appium实现自动化清理微信僵尸好友的方法

    这篇文章主要介绍了Python+Appium实现自动化清理微信僵尸好友的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • Python全角与半角之间相互转换的方法总结

    Python全角与半角之间相互转换的方法总结

    全角与半角转换在处理汉语语料中会经常出现,这里分别说明汉字、数字、字母的unicode编码范围,下面这篇文章主要给大家介绍了关于Python全角与半角之间相互转换的相关资料,需要的朋友可以参考下
    2022-03-03
  • python字典多键值及重复键值的使用方法(详解)

    python字典多键值及重复键值的使用方法(详解)

    下面小编就为大家带来一篇python字典多键值及重复键值的使用方法(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个才参考。一起跟随小编过来看看吧
    2016-10-10
  • Python实现快捷启动本地应用

    Python实现快捷启动本地应用

    这篇文章主要为大家详细介绍了如何使用Python实现一个快捷启动器,可以实现快速启动本地应用和文件秒开,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-07-07
  • 使用Python脚本备份华为交换机的配置信息

    使用Python脚本备份华为交换机的配置信息

    在现代网络管理中,备份交换机的配置信息是一项至关重要的任务,备份可以确保在交换机发生故障或配置错误时,能够迅速恢复到之前的工作状态,本文将详细介绍如何使用Python脚本备份华为交换机的配置信息,需要的朋友可以参考下
    2024-06-06
  • Python龙贝格法求积分实例

    Python龙贝格法求积分实例

    今天小编就为大家分享一篇Python龙贝格法求积分实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-02-02
  • 使用 Python 列出串口的实现方法

    使用 Python 列出串口的实现方法

    有时在编程时,我们需要获取有关系统中可用通信端口的信息, 我们将讨论如何使用 Python 来做到这一点,将讨论使用串口或 com 端口的通信, 我们将深入探索 Python 包,以帮助我们获得系统的可用通信端口,感兴趣的朋友一起看看吧
    2023-08-08
  • 深入了解Python中运算符函数的使用

    深入了解Python中运算符函数的使用

    Python 在“运算符”模块下为许多数学、逻辑、关系、按位等操作预定义了函数。本文介绍了一些基本功能,感兴趣的小伙伴可以跟随小编一起学习一下
    2022-09-09
  • 如何解决Python中tqdm和zip一起用进度条不显示问题

    如何解决Python中tqdm和zip一起用进度条不显示问题

    这篇文章主要介绍了如何解决Python中tqdm和zip一起用进度条不显示问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08

最新评论