• [量化投资-学习笔记016]Python+TDengine从零开始搭建量化分析平台-日志输出


    一个完成的程序一定少不了对异常的处理,以及错误日志的输出。

    在之前章节的程序中对这两部分没有进行说明,以下用两个单独的章节进行介绍。

    [量化投资-学习笔记017]Python+TDengine从零开始搭建量化分析平台-异常处理

    日志输出

    logging 是 Python 标准库中的一个模块,用于记录应用程序的事件和错误信息。它可以帮助开发人员在应用程序中实现灵活的日志记录,以便更好地了解应用程序的运行情况。模块提供DEBUG、INFO、WARNING、ERROR、CITICAL等多种日志级别。

    • logging 的运行效率高于 print

    简单应用:

    import logging
    import requests
    from requests.auth import HTTPBasicAuth
    
    def request_post(url, sql, user, pwd):
        logging.debug(f'Requeest from {url}')
        try:
            sql = sql.encode("utf-8")
            headers = {
                'Connection': 'keep-alive',
                'Accept-Encoding': 'gzip, deflate, br'
            }
            result = requests.post(url, data=sql, auth=HTTPBasicAuth(user,pwd),headers=headers)
            logging.debug(result)
            text = result.content.decode()
            logging.debug(text)
            return text
        except Exception as e:
            logging.error(e)
    
    logging.setLevel('INFO')
    request_post(url,sql,user,pwd)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    程序说明:

    上述代码做了以下更改和优化:

    1. 导入了loggingrequests模块,并从requests.auth模块中导入了HTTPBasicAuth类。

    2. 添加了日志记录操作。通过调用logging.debug()在关键位置添加日志记录,以便观察程序运行时的信息。

    3. 使用logging.debug()记录请求的URL和结果对象。

    4. 使用logging.error()记录异常信息。

    5. 设置日志级别为INFO,以确保输出INFO级别及以上的日志信息。

    通过调整日志级别,可以方便的控制日志输出,更好的调试程序。

    示例代码

    以上程序是将日志直接输出到控制台,logging 同样支持将日志写入文件。以下是 logging 的一个初始化示例。

    import logging
    log_file = 'test.log'
    handler_file = logging.FileHandler(log_file) 
    handler_console = logging.StreamHandler()    
    handler_file.setLevel('ERROR')             
    handler_console.setLevel('INFO')           
    selfdef_fmt = '[%(asctime)s] %(funcName)s(%(process)d) %(levelname)s - %(message)s'
    formatter = logging.Formatter(selfdef_fmt)
    handler_file.setFormatter(formatter)
    handler_console.setFormatter(formatter)
    logger = logging.getLogger(__name__)
    logger.setLevel('DEBUG')      
    logger.addHandler(handler_file)  
    logger.addHandler(handler_console)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    代码说明

    1. import logging:导入logging模块。

    2. log_file = 'test.log':定义日志文件的路径和名称。

    3. handler_file = logging.FileHandler(log_file):创建一个FileHandler实例,用于将日志记录到文件中。

    4. handler_console = logging.StreamHandler():创建一个StreamHandler实例,用于将日志记录输出到控制台。

    5. handler_file.setLevel('ERROR'):设置FileHandler实例的日志记录级别为ERROR。只有ERROR级别及以上的日志才会被记录到文件中。

    6. handler_console.setLevel('INFO'):设置StreamHandler实例的日志记录级别为INFO。INFO级别及以上的日志会被输出到控制台。

    7. selfdef_fmt = '[%(asctime)s] %(funcName)s(%(process)d) %(levelname)s - %(message)s':自定义日志记录格式,包括时间、函数名、进程ID、日志级别和消息。

    8. formatter = logging.Formatter(selfdef_fmt):创建一个Formatter实例,并传入自定义的日志格式。

    9. handler_file.setFormatter(formatter):将Formatter实例设置为FileHandler实例的格式器,以便将记录的日志按照指定的格式写入文件。

    10. handler_console.setFormatter(formatter):将Formatter实例设置为StreamHandler实例的格式器,以便将记录的日志按照指定的格式输出到控制台。

    11. logger.setLevel('DEBUG'):设置Logger实例的日志级别为DEBUG,即记录所有级别的日志信息。

    12. logger.addHandler(handler_file):将FileHandler实例添加到Logger实例中。

    13. logger.addHandler(handler_console):将StreamHandler实例添加到Logger实例中。

    这样配置完成后,logger对象可以使用不同级别的日志记录操作。例如,使用logger.debug('This is a debug message')来记录DEBUG级别的日志消息。DEBUG级别的日志将被写入文件和显示在控制台上。

    使用技巧

    如果某些函数和信息仅在调试阶段使用,那么可以使用 isEnabledFor 进行优化

    if logging.isEnabledFor(loggine.DEBUG):
        loggine.debug('%s',debug_fun())
    
    • 1
    • 2

    性能要优于

    logging.debug('%s',debug_fun())
    
    • 1

    注意事项

    1. 避免使用 root logger
    2. 统一 logging 配置
    3. 正确配置日志级别
    4. 避免在日志中打印敏感信息(如:用户名、密码)
    5. 保持时间格式统一
    6. 控制日志文件大小,规划日志好文件位置

    参考:

    1. Python实用教程系列——Logging日志模块
    2. python性能分析之log
    3. python 性能提升–去掉所有print
    4. python3的logging模块的最佳实践
    5. Python Logging Best Practices: The Ultimate Guide
    6. 10 Best Practices for Logging in Python
  • 相关阅读:
    vite环境变量相关
    2021 XV6 3:页表
    ElasticSearch7.3学习(九)----Mapping核心数据类型及dynamic mapping
    django带了一个权限系统
    Oracle VM VirtualBox 安装 Ubuntu Linux
    element el-popover自动关闭问题
    【QML】QML性能优化 | 3D场景优化
    【C++代码】平衡二叉树,二叉树的所有路径,左叶子之和--代码随想录
    大模型时代的基础设施:云原生峰会 KubeCon 2023 中国站重磅来袭!
    深入理解线程安全
  • 原文地址:https://blog.csdn.net/weixin_43700866/article/details/134390249