一个完成的程序一定少不了对异常的处理,以及错误日志的输出。
在之前章节的程序中对这两部分没有进行说明,以下用两个单独的章节进行介绍。
[量化投资-学习笔记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)
程序说明:
上述代码做了以下更改和优化:
导入了logging
和requests
模块,并从requests.auth
模块中导入了HTTPBasicAuth
类。
添加了日志记录操作。通过调用logging.debug()
在关键位置添加日志记录,以便观察程序运行时的信息。
使用logging.debug()
记录请求的URL和结果对象。
使用logging.error()
记录异常信息。
设置日志级别为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)
import logging
:导入logging模块。
log_file = 'test.log'
:定义日志文件的路径和名称。
handler_file = logging.FileHandler(log_file)
:创建一个FileHandler实例,用于将日志记录到文件中。
handler_console = logging.StreamHandler()
:创建一个StreamHandler实例,用于将日志记录输出到控制台。
handler_file.setLevel('ERROR')
:设置FileHandler实例的日志记录级别为ERROR。只有ERROR级别及以上的日志才会被记录到文件中。
handler_console.setLevel('INFO')
:设置StreamHandler实例的日志记录级别为INFO。INFO级别及以上的日志会被输出到控制台。
selfdef_fmt = '[%(asctime)s] %(funcName)s(%(process)d) %(levelname)s - %(message)s'
:自定义日志记录格式,包括时间、函数名、进程ID、日志级别和消息。
formatter = logging.Formatter(selfdef_fmt)
:创建一个Formatter实例,并传入自定义的日志格式。
handler_file.setFormatter(formatter)
:将Formatter实例设置为FileHandler实例的格式器,以便将记录的日志按照指定的格式写入文件。
handler_console.setFormatter(formatter)
:将Formatter实例设置为StreamHandler实例的格式器,以便将记录的日志按照指定的格式输出到控制台。
logger.setLevel('DEBUG')
:设置Logger实例的日志级别为DEBUG,即记录所有级别的日志信息。
logger.addHandler(handler_file)
:将FileHandler实例添加到Logger实例中。
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())
root logger
logging
配置