Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python3.X在关闭连接时记录RotatingFileHandler时出现问题_Python_Python 3.x_Snowflake Cloud Data Platform_Python Logging - Fatal编程技术网

python3.X在关闭连接时记录RotatingFileHandler时出现问题

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

我写了一个脚本,从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/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