python3.X在关闭连接时记录RotatingFileHandler时出现问题
我写了一个脚本,从snowflake中读取数据并在缓存中更新。在脚本执行之后,snowflake正在尝试自动关闭所有剩余的连接,而连接正在关闭库正在记录一些详细信息,我将从中获得以下问题python3.X在关闭连接时记录RotatingFileHandler时出现问题,python,python-3.x,snowflake-cloud-data-platform,python-logging,Python,Python 3.x,Snowflake Cloud Data Platform,Python Logging,我写了一个脚本,从snowflake中读取数据并在缓存中更新。在脚本执行之后,snowflake正在尝试自动关闭所有剩余的连接,而连接正在关闭库正在记录一些详细信息,我将从中获得以下问题 --- Logging error --- Traceback (most recent call last): File "/usr/local/Cellar/python/3.7.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/loggi
--- Logging error ---
Traceback (most recent call last):
File "/usr/local/Cellar/python/3.7.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/logging/handlers.py", line 69, in emit
if self.shouldRollover(record):
File "/usr/local/Cellar/python/3.7.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/logging/handlers.py", line 183, in shouldRollover
self.stream = self._open()
File "/usr/local/Cellar/python/3.7.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/logging/__init__.py", line 1116, in _open
return open(self.baseFilename, self.mode, encoding=self.encoding)
NameError: name 'open' is not defined
Call stack:
File "~/.virtualenvs/test-ven/lib/python3.7/site-packages/snowflake/connector/connection.py", line 211, in __del__
self.close(retry=False)
File "~/.virtualenvs/test-ven/lib/python3.7/site-packages/snowflake/connector/connection.py", line 529, in close
logger.info('closed')
Message: 'closed'
Arguments: ()
我尝试删除RotatingFileHandler,然后就没有问题了。事情执行得很顺利,我尝试了python 3.5、3.7版本,两个版本都出现了错误。下面是我的日志配置,我可能做错了什么
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'verbose': {
'format': '%(asctime)s %(levelname)-8s [%(filename)s:%(lineno)d] %(message)s'
}
},
'handlers': {
'console': {
'class': 'logging.StreamHandler',
'level': 'INFO',
'formatter': 'verbose'
},
'cron_file': {
'class': 'logging.handlers.RotatingFileHandler',
'level': 'INFO',
'formatter': 'verbose',
'filename': '/var/log/my-project/crons.log',
'mode': 'a',
'maxBytes': 5242880,
'backupCount': 10
},
'error_file': {
'class': 'logging.handlers.RotatingFileHandler',
'level': 'WARN',
'formatter': 'verbose',
'filename': '/var/log/my-project/error.log',
'mode': 'a',
'maxBytes': 5242880,
'backupCount': 10
}
},
'loggers': {
# root logger
'': {
'handlers': ['console', 'cron_file', 'error_file'],
'level': 'DEBUG',
},
'crons': {
'handlers': ['console', 'cron_file', 'error_file'],
'level': 'DEBUG',
}
}
}
查看原始调用堆栈:
调用堆栈:
文件“~/.virtualenvs/test-ven/lib/python3.7/site-packages/snowflake/connector/connection.py”,第211行,在__
self.close(重试=False)
文件“~/.virtualenvs/test-ven/lib/python3.7/site-packages/snowflake/connector/connection.py”,第529行,关闭
logger.info('已关闭')
它告诉您,当从内存中删除对象时,它正在尝试登录。
调用\uuu del\uu
时有两种情况。您调用del对象
,或者它被垃圾收集。对于后一种情况,它发生了两次。第一个是当refcount
达到0
时,第二个是当解释器关闭时,即程序退出
此错误在解释器关闭时发生。此时,对象被删除,全局命名空间被清除。这意味着打开
关键字在调用它时不再存在。这种错误有时会发生,有时不会。因为垃圾收集器在自己的线程上运行,所以有时它会在日志调用之前删除全局命名空间
那么你能做些什么呢
显而易见的选择是不要将日志记录放在\uu del\uu
中。但由于它是另一个图书馆,所以这个选项实际上是不可行的。另一种选择是,当您不再需要连接时,记得自己关闭连接。
但有一种更通用的解决方案,即在解释器关闭之前,在程序结束时禁用日志记录:
导入日志
#你的代码
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
#你的代码
logging.disable(logging.CRITICAL)#忽略小于或等于CRITICAL的级别
#EOF