python+ffpyplayer制作的视频播放程序第四篇

大家好,新的一周又开始了,继续上周的主题。我先写一下外围工具代码的使用,按代码顺序开始,先介绍一下日志模块。

python内置了日志模块,这个模块为应用与库实现了灵活的事件日志系统的函数与类。如果大家想仔细研读的话,可以插看官方文档:logging --- Python 的日志记录工具 — Python 3.12.4 文档

main.py代码中日志初始化部分:

logs.logger.APP_LOGGER_NAME='video_main'

logs.logger.LOG_DIR=os.path.dirname(os.path.abspath(sys.argv[0]))

log = logs.logger.setup_logger(file_name="app_demo.log",loglevel="DEBUG")


日志模块的代码:

import logging

import os

import sys

import com.sunway.util.pathtools as ptools

APP_LOGGER_NAME = "logging_main"

LOG_DIR=ptools.get_project_root()

LOG_PATH = LOG_DIR + '\\' + 'logs'  # 日志路径

'''

用于配置日志的方法

logger_name :日志记录器名称,用于创建命名的日志器对象

file_name:日志文件名称

'''

def setup_logger(logger_name=APP_LOGGER_NAME, file_name=None,loglevel='DEBUG'):

    print(APP_LOGGER_NAME)

    if not os.path.exists(LOG_PATH):

        os.makedirs(LOG_PATH)

    # getLogger()方法:用于获取logger对象。如果多次调用getLogger()方法并传入相同的名称,将返回同一个logger对象。

    # 如果不传入名称,则返回root logger对象。

    logger = logging.getLogger(logger_name)

    # 设置

    logger.setLevel(logging.getLevelName(loglevel))

    # 格式化器,用于将LogRecord对象转换为字符串,此处为:时间|日志器名称|日志级别|日志内容

    formatter = logging.Formatter(

        "%(asctime)s | %(name)s |  %(levelname)s: %(message)s"

    )

    # 创建一个日志处理器,处理器,用于将日志记录发送到不同的目标,如文件、控制台、syslog等。logging模块中提供了多种处理器,

    # 如StreamHandler、FileHandler、SysLogHandler等。

    sh =init_streamHd(formatter)

    logger.handlers.clear()

    logger.addHandler(sh)

    # 如果有file_name,则添加一个文件日志处理器.

    # 每个logger对象可以有多个handler对象,用于将日志记录发送到不同的目标

    fsh=init_fileHd(formatter,logfile_name=file_name)

    logger.addHandler(fsh)

    rsh=init_rotaingfile_handler(formatter)

    logger.addHandler(rsh)

    trsh = init_timerotating_handler(formatter)

    logger.addHandler(trsh)   

    return logger


 

def init_streamHd(format, loglevel='DEBUG'):

    stream_handler = logging.StreamHandler(sys.stdout)

    stream_handler.setLevel(logging.getLevelName(loglevel))

    stream_handler.setFormatter(format)

    return stream_handler

'''

默认的输出文件

'''

def init_fileHd(format, loglevel='INFO',logfile_name='all_log.txt'):

    file_handler = logging.FileHandler(filename=os.path.join(LOG_PATH, logfile_name))

    file_handler.setLevel(logging.getLevelName(loglevel))

    file_handler.setFormatter(format)

    return file_handler

'''

  循环覆盖式日志处理器,将打开指定的文件并将其用作日志记录流.

'''

def init_rotaingfile_handler(format,loglevel='DEBUG',logfile_name="rotaingfile.log"):

    # 使用 maxBytes 和 backupCount 值来允许文件以预定的大小执行 rollover。

    # 当即将超出预定大小时,将关闭旧文件并打开一个新文件用于输出

    fh = logging.handlers.RotatingFileHandler(

        filename=os.path.join(LOG_PATH, logfile_name),

        mode='a',

        maxBytes=30 * 1024 * 1024,

        backupCount=3,

    )

    fh.setLevel(logging.getLevelName(loglevel))

    fh.setFormatter(format)

    return fh

'''

TimedRotatingFileHandler 可以按照时间轮转日志,例如每天或每小时生成一个新的日志文件。

interval:时间间隔的数量,默认为 1;例如,当 when=‘D’ 且 interval=7 时,表示每周轮转一次;

backupCount:备份文件数目;当生成的日志文件数量超过该数目时,会自动删除旧的备份日志文件;默认值为 0,表示不备份;

'''

def init_timerotating_handler(format, loglevel='INFO', logfile_name="timerotating.log", update_freqency="M", save_interval=7):

    fh = logging.handlers.TimedRotatingFileHandler(

        filename=os.path.join(LOG_PATH, logfile_name),

        when=update_freqency,

        interval=save_interval,

        backupCount=7

    )

    fh.setLevel(logging.getLevelName(loglevel))

    fh.setFormatter(format)

    return fh


 

def get_logger(module_name):

    # 创建子logger对象。子logger对象的名称是父logger对象的名称加上一个后缀,后缀由getChild()方法的参数指定(此处为模块名称:com.sunway.test.module)

    # 子logger对象继承了父logger对象的所有属性,如日志级别、过滤器、处理器等。子logger对象还可以设置自己的属性,如日志级别、过滤器、处理器等。

    return logging.getLogger(APP_LOGGER_NAME).getChild(module_name)

  • 23
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wzffzw

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值