【山东大学软件学院 21 级项目实训】日志记录系统实现

引言

我们编写了智能车运行过程中的日志记录系统,通过该系统实现对智能车运行状态和错误信息的记录和管理。本部分记录了日志记录系统的详细步骤和代码示例。

日志记录系统

日志记录系统是智能车运行过程中不可或缺的一部分,通过对运行状态和错误信息的记录,能够帮助我们更好地调试和维护智能车。以下是实现该功能的代码。

  1. 导入必要的库 首先,我们需要导入相关库:

import logging, os, datetime, time, glob
from logging.handlers import RotatingFileHandler
  • logging 用于日志记录。

  • osglob 用于操作系统相关功能。

  • datetimetime 用于时间处理。

  • RotatingFileHandler 用于实现日志文件的滚动记录。

  1. 创建日志文件 编写 logger_file 函数,用于创建日志文件:

def logger_file(dir):
    for i in range(10):
        str_date = "2024-03-1" + str(i)
        path = os.path.join(dir, str_date + "-all" + ".log")
        # 创建文件
        file = open(path, "w")
        file.close()
        time.sleep(1)
  • logger_file 函数在指定目录下创建10个日志文件,文件名按照日期命名。

  1. 删除旧日志文件 编写 logger_file_remove_byday 函数,用于删除指定天数之前的日志文件:

def logger_file_remove_byday(dir, day=10):
    error_file_list = glob.glob(dir + "/*all.log")
    error_file_list.sort()
    for i in range(len(error_file_list) - day):
        time_file_lists = glob.glob(error_file_list[i][:-7] + "*")
        for file_name in time_file_lists:
            print(file_name)
            os.remove(file_name)
  • logger_file_remove_byday 函数删除指定目录下10天前的日志文件,确保日志文件不会无限制增长。

  1. 定义日志处理函数 编写 logger_handler 函数,用于创建和配置日志处理器:

def logger_handler(name: str) -> logging.Logger:
    logger = logging.getLogger(name)
    logger.setLevel(logging.DEBUG)
    cur_path = os.path.abspath(os.path.dirname(__file__))    # 当前文件路径
    
    log_dir = os.path.join(cur_path, 'logs')  # log_path为存放日志的路径
    logger_file_remove_byday(log_dir)
​
    now_time = datetime.datetime.now().strftime('%Y-%m-%d')  # 当前日期格式化
    __all_log_path = os.path.join(log_dir, now_time + "-all" + ".log")  # 收集所有日志信息文件
    __error_log_path = os.path.join(log_dir, now_time + "-error" + ".log")  # 收集错误日志信息文件
    formatter = logging.Formatter('%(asctime)s-%(filename)s-[line:%(lineno)d]-%(levelname)s-[log]:%(message)s')
    handler_cfgs = [{'type': 'file', 'filename': __all_log_path, 'level': logging.INFO, 'formatter': formatter},
                    {'type': 'file', 'filename': __error_log_path, 'level': logging.ERROR, 'formatter': formatter},
                    {'type': 'console', 'level': logging.DEBUG, 'formatter': formatter}]
    for handler_cfg in handler_cfgs:
        if handler_cfg['type'] == 'file':
            handler = RotatingFileHandler(filename=handler_cfg['filename'], maxBytes=1 * 1024 * 1024, backupCount=3, encoding='utf-8')
        elif handler_cfg['type'] == 'console':
            handler = logging.StreamHandler()
        handler.setFormatter(handler_cfg['formatter'])
        handler.setLevel(level=handler_cfg['level'])
        logger.addHandler(handler)
    return logger
  • logger_handler 函数创建日志处理器,并配置日志格式和日志文件的滚动记录。

  1. 测试日志记录 编写 loger_test 函数,用于测试日志记录功能:

def loger_test():
    logger = logging.getLogger('mylogger')
    logger.setLevel(logging.DEBUG)
​
    cur_path = os.path.abspath(os.path.dirname(__file__))    # 当前文件路径
    log_path = os.path.join(cur_path, 'logs')  # log_path为存放日志的路径
    if not os.path.exists(log_path):
        os.mkdir(log_path)  # 若不存在logs文件夹,则自动创建
​
    fh = logging.FileHandler('mylog.log')
    fh.setLevel(logging.DEBUG)
​
    formatter = logging.Formatter('%(asctime)s- %(filename)s-[line:%(lineno)d]-%(levelname)s-[log]:-%(message)s')
    fh.setFormatter(formatter)
​
    logger.addHandler(fh)
    i = 0
    while True:
        i += 1
        logger.debug('debug message:' + str(i))
        logger.info('info message')
        logger.warning('warning message')
        logger.error('error message')
        logger.critical('critical message')
        time.sleep(1)
  • loger_test 函数测试日志记录功能,并生成不同级别的日志信息。

  1. 主函数 编写主函数,启动日志记录测试:

if __name__ == '__main__':
    logger = logger_handler("my_logger")
    logger_file_remove_byday("./logs")
    # loger_test()
  • __name__ == "__main__" 判断用于确保代码在作为脚本执行时运行日志记录测试。

总结

通过以上代码,智能车实现了日志记录系统。该系统通过对运行状态和错误信息的记录,帮助我们更好地调试和维护智能车。

  • 25
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值