[量化投资-学习笔记016]Python+TDengine从零开始搭建量化分析平台-日志输出
  zwmX4WA4Dykt 2023年12月07日 15 0


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

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

[量化投资-学习笔记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. 导入了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. 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())

性能要优于

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

注意事项

  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


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年12月07日 0

暂无评论

推荐阅读
zwmX4WA4Dykt