如何停止Python http.server模块HTTPServer服务的日志输出
问题根本原因
BaseHTTPRequestHandler的日志输出没有使用Python标准logging模块,是自带的log_message方法直接打印到标准错误流,因此调整logging级别无法拦截日志- 原有代码中日志级别设置的代码写在了阻塞方法
httpd.serve_forever()之后,这行代码永远不会被执行,本身就不生效
修复方案
推荐通过重写请求处理类的log_message方法屏蔽日志,不会影响其他功能的正常输出,代码示例如下:
from http.server import HTTPServer, BaseHTTPRequestHandler import threading # 自定义无日志的请求处理类 class NoLogRequestHandler(BaseHTTPRequestHandler): def log_message(self, format, *args): # 空实现,不输出任何日志 pass def server_run(): # 使用自定义的无日志Handler初始化服务 httpd = HTTPServer(('localhost', 4443), NoLogRequestHandler) httpd.serve_forever() threading.Thread(target=server_run).start() print("Server running")
如果不需要保留其他stderr输出,也可以选择临时重定向标准错误流到空设备实现屏蔽:
from http.server import HTTPServer, BaseHTTPRequestHandler import threading import sys import os def server_run(): sys.stderr = open(os.devnull, 'w') httpd = HTTPServer(('localhost', 4443), BaseHTTPRequestHandler) httpd.serve_forever() threading.Thread(target=server_run).start() print("Server running")
内容的提问来源于stack exchange,提问作者Michi
相关产品推荐
相关产品推荐

