Python按文件大小轮转日志时不备份且停止记录问题求助
树莓派4上RotatingFileHandler日志轮转失败的权限问题解决
问题场景
树莓派4设备中,ZoneMinder以www-data用户身份每日调用Python脚本约300次。脚本属主为pi用户,属组为www-data,且pi是www-data组成员。脚本通过RotatingFileHandler实现日志轮转,配置maxBytes=10_000_000(10MB)、backupCount=3,但日志文件google_drive_upload.log达到最大尺寸后,既不生成google_drive_upload.log.1这类备份文件,也无法创建新日志,日志停更两周。
额外现象:
- 手动删除日志文件后,脚本无法自动重建日志文件
- 手动创建日志文件并设置权限为
pi/www-data时,脚本可正常运行至日志达到最大尺寸,之后再次出现轮转失败问题
报错信息
以www-data用户直接执行脚本时,出现权限拒绝错误:
pi@raspberrypi4zm:~/zm-scripts $ sudo -u www-data ./google_drive_upload.py 8008 Traceback (most recent call last): File "/home/pi/zm-scripts/./google_drive_upload.py", line 61, in <module> file_handler = logging.handlers.RotatingFileHandler(Path(__file__).parent / "google_drive_upload.log", File "/usr/lib/python3.9/logging/handlers.py", line 153, in __init__ BaseRotatingHandler.__init__(self, filename, mode, encoding=encoding, File "/usr/lib/python3.9/logging/handlers.py", line 58, in __init__ logging.FileHandler.__init__(self, filename, mode=mode, File "/usr/lib/python3.9/logging/__init__.py", line 1142, in __init__ StreamHandler.__init__(self, self._open()) File "/usr/lib/python3.9/logging/__init__.py", line 1171, in _open return open(self.baseFilename, self.mode, encoding=self.encoding, PermissionError: [Errno 13] Permission denied: '/home/pi/zm-scripts/google_drive_upload.log'
初始权限分析
当时脚本所在目录zm-scripts的权限如下:
pi@raspberrypi4zm:~/zm-scripts $ ll total 44 drwxr-xr-x 3 pi www-data 4096 Jan 27 11:50 ./ drwxr-xr-x 9 pi pi 4096 Jan 12 00:35 ../ -rwxr-xr-- 1 pi www-data 161 Jan 12 00:52 .env* -rwxr-xr-- 1 pi www-data 106 Jan 12 01:06 .env_example* drwxr-xr-x 8 pi www-data 4096 Jan 26 15:05 .git/ -rwxr-xr-- 1 pi www-data 66 Jan 5 03:06 .gitattributes* -rwxr-xr-- 1 pi www-data 2762 Jan 5 03:06 .gitignore* -rwxr-xr-x 1 pi www-data 8295 Jan 26 13:36 google_drive_upload.py* -rwxr-xr-x 1 pi www-data 36 Jan 5 03:06 README.md*
问题根源:
- 目录
zm-scripts权限为drwxr-xr-x,www-data组仅有读权限,无写入权限,导致日志轮转时无法创建备份文件 - 日志文件属主为
pi,www-data用户对其仅有读权限,无法进行截断、重命名等轮转操作
解决步骤
- 修改脚本目录权限,赋予
www-data组写入权限:
chmod g+w /home/pi/zm-scripts
- 修改日志文件的属主和属组为
www-data:
chown www-data:www-data /home/pi/zm-scripts/google_drive_upload.log
验证结果
调整后目录权限如下,日志已正常生成备份文件,轮转功能恢复:
pi@raspberrypi4zm:~/zm-scripts $ ll total 88 drwxrwxr-x 3 pi www-data 4096 Jan 27 12:15 ./ drwxr-xr-x 9 pi pi 4096 Jan 12 00:35 ../ -rwxr-xr-- 1 pi www-data 161 Jan 12 00:52 .env* -rwxr-xr-- 1 pi www-data 106 Jan 12 01:06 .env_example* drwxr-xr-x 8 pi www-data 4096 Jan 26 15:05 .git/ -rwxr-xr-- 1 pi www-data 66 Jan 5 03:06 .gitattributes* -rwxr-xr-- 1 pi www-data 2762 Jan 5 03:06 .gitignore* -rw-r--r-- 1 www-data www-data 12003 Jan 27 12:16 google_drive_upload.log -rw-r--r-- 1 www-data www-data 24859 Jan 27 12:12 google_drive_upload.log.1 -rwxr-xr-x 1 pi www-data 8295 Jan 27 12:13 google_drive_upload.py* -rwxr-xr-x 1 pi www-data 36 Jan 5 03:06 README.md*
内容的提问来源于stack exchange,提问作者kanka.dev
相关产品推荐
相关产品推荐

