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