本文共 1896 字,大约阅读时间需要 6 分钟。
今天,我尝试优化了一个用于日志记录的Python代码。这个代码的目标是为应用程序的功能模块生成日志,记录每个模块的执行情况。以下是我优化后的代码和解释:
import osimport logbookfrom logbook.more import ColorizedStderrHandlerfrom functools import wrapscheck_path = os.path.abspath('.')LOG_DIR = os.path.join(check_path, 'log')file_stream = Falseif not os.path.exists(LOG_DIR): os.makedirs(LOG_DIR) file_stream = Truedef get_logger(name='jiekou', file_log=file_stream, level=''): logbook.set_datetime_format('local') ColorizedStderrHandler(bubble=False, level=level).push_thread() logbook.TimedRotatingFileHandler( os.path.join(LOG_DIR, f'{name}.log'), date_format='%Y-%m-%d-%H', bubble=True, encoding='utf-8' ).push_thread() return logbook.Logger(name)LOG = get_logger(file_log=file_stream, level='INFO')def logger(param): def wrap(function): @wraps(function) def _wrap(*args, **kwargs): LOG.info(f"当前模块 {param}") return function(*args, **kwargs) return _wrap return wrap os.path.abspath('.')确保路径是当前工作目录的绝对路径,避免相对路径在不同工作目录下出错。LOG_DIR不存在时,自动创建该目录,确保日志文件能正确写入。f格式字符串使日志输出更具现代化感,且避免了直接拼接字符串可能导致的错误。level参数,允许在不同场景下配置不同的日志级别(如DEBUG、INFO、WARNING等)。logger装饰器的参数处理得更加简洁,减少了不必要的日志冗余。import requests@logger('requests封装')def requests封装(): pass@logger('解析测试用例文件')def 解析测试用例文件(): pass@logger('测试')def 测试(): pass@logger('断言测试结果')def 断言测试结果(): pass@logger('保存测试结果')def 保存测试结果(): pass 运行上述代码后,日志会以如下格式输出:
[2017-10-16 20:54:46.439386] INFO: jiekou: 当前模块 requests封装[2017-10-16 20:54:46.900412] INFO: jiekou: 当前模块 解析测试用例文件[2017-10-16 20:54:47.323436] INFO: jiekou: 当前模块 解析测试用例文件...
<当前工作目录>/log/jiekou.log,可根据需要修改name参数。ColorizedStderrHandler确保控制台日志会被正确颜色化,便于阅读。TimedRotatingFileHandler默认每日轮转一次,可以根据需求调整轮转时间和保留天数。通过这些优化,代码更加稳定且易于维护,同时日志输出也更加规范和有序。
转载地址:http://yjjyz.baihongyu.com/