Windows下访问Apache日志文件遇PermissionError: [Errno 13]权限拒绝如何解决?
解决Apache日志监控脚本的PermissionError问题
我来帮你排查这个权限问题,之前处理Windows下日志监控时也碰到过类似的情况,给你几个针对性的解决方案:
1. 排查Apache的文件锁定问题
Windows下的Apache(尤其是XAMPP自带的版本)经常会独占锁定日志文件,导致其他进程无法读取。你可以先临时停止Apache服务,再运行你的脚本:
- 如果停止后脚本能正常读取日志,那就是Apache的锁定问题。
- 解决办法:配置Apache的日志滚动(比如使用
rotatelogs工具),让Apache定期切换日志文件,这样旧日志会被释放锁定,你的脚本可以监控新生成的日志文件。
2. 确认文件权限的细节设置
即使以管理员身份运行,NTFS文件权限的细节可能还是会限制读取:
- 右键
access.log→ 属性 → 安全 → 高级 - 确认当前用户(或管理员组)拥有读取和读取与执行的权限,且权限为「允许」
- 检查是否禁用了权限继承,确保权限正确应用到该文件上
3. 使用Windows文件共享模式打开日志
Python默认的文件打开模式在Windows下可能和Apache的写入模式冲突,试试用Windows API的共享打开方式,允许同时读写:
import os import time import win32file import win32con def follow(fp_path): # 以共享读写模式打开文件 handle = win32file.CreateFile( fp_path, win32file.GENERIC_READ, win32file.FILE_SHARE_READ | win32file.FILE_SHARE_WRITE, None, win32file.OPEN_EXISTING, win32con.FILE_ATTRIBUTE_NORMAL, None ) # 移动到文件末尾 handle.Seek(0, os.SEEK_END) while True: line = handle.ReadLine() if not line: time.sleep(0.1) continue # 转成UTF-8字符串(根据你的日志编码调整) yield line.decode('utf-8') if __name__ == '__main__': loglines = follow(r'C:\xampp\apache\logs\access.log') for line in loglines: data = LogParser(line, db) # 后续处理逻辑
4. 检查其他占用日志的进程
除了Apache,可能还有其他工具(比如日志查看器、杀毒软件、备份工具)在锁定日志文件:
- 使用微软官方的Process Explorer工具,搜索
access.log,查看哪些进程正在使用它 - 关闭这些占用进程后再测试你的脚本
内容的提问来源于stack exchange,提问作者jack_lv




