Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.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
使用python 3.3.4和RotatingFileHandler时出现PermissionError_Python_Python 3.x_Logging - Fatal编程技术网

使用python 3.3.4和RotatingFileHandler时出现PermissionError

使用python 3.3.4和RotatingFileHandler时出现PermissionError,python,python-3.x,logging,Python,Python 3.x,Logging,我正在尝试为我正在使用python 3.3.4和PyQt4编写的GUI应用程序获取一个循环日志文件 我的主脚本中有以下代码片段: import logging import resources logger = logging.getLogger('main.test') def main(): logger.setLevel(logging.DEBUG) fh = RotatingFileHandler(resources.LOG_FILE_PATH, maxBytes=

我正在尝试为我正在使用python 3.3.4和PyQt4编写的GUI应用程序获取一个循环日志文件

我的主脚本中有以下代码片段:

import logging
import resources

logger = logging.getLogger('main.test')

def main():
    logger.setLevel(logging.DEBUG)

    fh = RotatingFileHandler(resources.LOG_FILE_PATH, maxBytes=500, backupCount=5)
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    fh.setFormatter(formatter)

    logger.addHandler(fh)
    logger.info('main')
我的最大字节数很低,因此我可以测试旋转是否正常工作,而实际情况并非如此。每当应旋转日志时,我都会收到以下错误:

Traceback (most recent call last):
File "C:\Python33\lib\logging\handlers.py", line 73, in emit
self.doRollover()
File "C:\Python33\lib\logging\handlers.py", line 176, in doRollover
self.rotate(self.baseFilename, dfn)
File "C:\Python33\lib\logging\handlers.py", line 116, in rotate
os.rename(source, dest)
PermissionError: [WinError 32] The process cannot access the file because it is being used by another process: 'C:\\Users\\myuser\\.logtest\\test.log.1'
没有任何记录。非常感谢您的帮助。
谢谢

检查文件是否未被Windows文件索引、防病毒或其他软件保持打开状态。无法重命名打开的文件。

我将应用程序更改为使用dictConfig,并创建了一个保存字典配置的单独文件。在我的主要应用程序顶部,我有:

from log.logger import LOGGING

logging.config.dictConfig(LOGGING)
logger = logging.getLogger('testlogging')
然后在
log.logger
中,我有:

import logging
import sys
import resources

LOGGING = {
        "version":1,
        "handlers":{
                    "fileHandler":{
                        "class":"logging.handlers.RotatingFileHandler",
                        "formatter":"myFormatter",
                        "filename":resources.LOG_FILE_PATH,
                        "maxBytes":100000,
                        "backupCount":5
                        },
                    "console":{
                        "class":"logging.StreamHandler",
                        "formatter":"myFormatter"
                        }
                    },        
        "loggers":{
            "aoconnect":{
                "handlers":["fileHandler", "console"],
                "level":"DEBUG",
                }
            },

        "formatters":{
            "myFormatter":{
                "format":"%(asctime)s - %(name)s - %(levelname)s - %(message)s"
                }
            }
        }

这一切似乎都很好。

您可以直接在basicConfig()中指定处理程序,而不是向logger对象添加处理程序。如果将RotatingFileHandler添加到logger对象,则一个对象可能会打开日志文件,同时另一个对象可能会尝试重命名它,从而引发PermissionError

import logging
import resources
from logging.handlers import RotatingFileHandler

logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', handlers=[RotatingFileHandler(filename=resources.LOG_FILE_PATH, maxBytes=500, backupCount=5)])
logger = logging.getLogger('main.test')

def main():
    logger.setLevel(logging.DEBUG)
    logger.info('main')
下面的代码似乎工作得很好

import logging
import resources
from logging.handlers import RotatingFileHandler

logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', handlers=[RotatingFileHandler(filename=resources.LOG_FILE_PATH, maxBytes=500, backupCount=5)])
logger = logging.getLogger('main.test')

def main():
    logger.setLevel(logging.DEBUG)
    logger.info('main')

不能在basicConfig()和RotatingFileHandler()中指定相同的文件名。我也遇到了同样的问题,我从basicConfig()中删除了filename参数,它现在可以工作了。

在我的例子中,删除
server.log
文件后,文件大小已满

LOGS_DIR = os.path.join(BASE_DIR, 'logs')
LOGGING = {
    'version': 1,
    'handlers': {
    'log_file': {
        'level': 'INFO',
        'class': 'logging.handlers.RotatingFileHandler',
        'filename': os.path.join(LOGS_DIR, 'server.log'),
        'backupCount': 10, # keep at most 10 log files
        'maxBytes': 5*1024*1024 # 5242880 bytes (5MB)
        },
    },
    'loggers': {
        'django': {
            'handlers':['log_file'],
            'propagate': True,
            'level':'INFO',
        },
    },
}
在我的情况下(Windows Server 2016+IIS+FastCGI+Flask),我最终通过关闭文件夹中的文件索引来修复它。

资料来源:


顺便说一句,它正常工作了几个月。。。我不知道为什么…

花了半天时间在这个问题上,因为非先前的答案解决了我的问题

我的工作解决方案是使用而不是旋转FileHandler。在多线程场景(如Flask app)中,当我们旋转达到最大大小的日志文件时,将引发PermissionError

安装
pypiwin32
以消除
无模块名win32con
错误


感谢根据滚动到的文件正在使用的错误转到