Python实现自定义HTTP服务器时日志文件无法写入问题求助
问题分析与修复方案
根因排查
- 类型拼接错误:
addr[1]返回的端口为整数类型,直接与字符串拼接会触发TypeError,代码运行到写入步骤前就中断,仅执行了open()创建文件的逻辑,后续写入未执行 - 索引越界异常:如果传入的
request为空、或请求行格式不符合HTTP规范,拆分headers[0]时取索引[1]会触发IndexError,同样会中断写入流程 - 缩进不规范:你贴出的
do_LOG方法首行def与下一行path定义的缩进不一致,Python对缩进敏感,若实际代码缩进不符合规范,会导致重写方法不生效,实际执行的是父类的空实现 - 缓冲区未刷新:若程序在写入后立刻异常退出,缓冲区的内容还没来得及刷入磁盘就被释放,也会导致生成的文件为空
修复后的代码
def do_LOG(self, addr, request): path = 'log/logging.txt' host = addr[0] # 端口转为字符串,避免类型拼接错误 port = str(addr[1]) method = request[:4] try: headers = request.split('\n') filename = headers[0].split()[1] # 使用with上下文管理器自动处理文件关闭、缓冲区刷新,避免资源泄漏 with open(path, "a+", encoding="utf-8") as f: log_content = f'Server used: {host}\nPort used: {port}\nMethod Served: {method}\nFilename: {filename}\n\n' f.write(log_content) except (IndexError, TypeError) as e: # 异常兜底,请求格式错误时也写入报错信息,避免生成完全空白的日志文件 with open(path, "a+", encoding="utf-8") as f: f.write(f'Invalid log request received, error info: {str(e)}\n\n') return
验证步骤
- 提前确认程序运行的工作目录下存在
log文件夹,若不存在需手动创建,避免open抛出路径不存在的异常 - 可在方法入口添加打印逻辑,确认重写的方法确实被调用,没有走父类的空实现
- 触发一次HTTP请求后,立刻查看日志文件内容,确认写入正常
内容的提问来源于stack exchange,提问作者Vaishnavi Rathod
相关产品推荐
相关产品推荐

