如何关闭libcurl调用curl_easy_perform时产生的打印日志?
问题:如何关闭定时POST时Flask服务器输出的访问日志?
我用libcurl 8.5.0的curl_easy_perform接口定时向Flask服务器POST数据,相关代码如下:
// Set the URL of your Flask server: *this->port_* is port number, *api* is the name of web interface (sendData) std::string url = "http://localhost:" + std::to_string(this->port_) + "/api/" + api; curl_easy_setopt(curl_, CURLOPT_URL, url.c_str()); // Set the POST data string curl_easy_setopt(curl_, CURLOPT_POSTFIELDS, data.c_str()); curl_easy_setopt(curl_, CURLOPT_POST, 1L); // set this option to disable echo message curl_easy_setopt(curl_, CURLOPT_WRITEFUNCTION, curi_cb); // #1 curl_easy_setopt(curl_, CURLOPT_VERBOSE, 0L); // #2 // write data callback, to nul FILE *f = fopen("nul", "w"); curl_easy_setopt(curl_, CURLOPT_WRITEDATA, f); // #3 // Perform the request CURLcode res = curl_easy_perform(curl_); // Check for errors if(res!=CURLE_OK) { WLOG("curl_easy_perform() failed: ret=" << curl_easy_strerror(res)); }
每次发送数据时,控制台都会输出类似127.0.0.1 - - [08/Apr/2024 10:39:20] "POST /api/sendData HTTP/1.1" 200的日志行。我尝试了以下方案但都无效:
- 设置
CURLOPT_WRITEFUNCTION为回调函数(仅关闭了响应消息,没解决该打印行):
static size_t curl_cb(void* buffer, size_t size, size_t nmemb, void* lpVoid) { (void)buffer; (void)lpVoid; return size * nmemb; }
- 设置
CURLOPT_VERBOSE为0; - 设置
CURLOPT_WRITEDATA为null。
定时POST会频繁输出该日志导致控制台被占满,请问怎么关闭或禁用这个打印行?
问题根源
你看到的日志不是libcurl输出的,而是Flask内置的Werkzeug服务器输出的访问日志。所以修改libcurl的参数无法关闭它,需要从Flask端入手解决。
解决方法
方法1:修改Flask日志级别,屏蔽访问日志
在Flask代码中添加配置,将Werkzeug的访问日志级别调至错误级以上,或者直接禁用:
from flask import Flask import logging app = Flask(__name__) # 获取Werkzeug日志实例,设置级别为ERROR(仅输出错误日志) log = logging.getLogger('werkzeug') log.setLevel(logging.ERROR) # 或者直接完全禁用Werkzeug日志 # log.disabled = True
方法2:自定义请求处理器,跳过访问日志输出
重写Werkzeug的请求日志方法,让它不输出访问记录:
from flask import Flask from werkzeug.serving import WSGIRequestHandler app = Flask(__name__) # 自定义处理器,重写日志方法 class SilentRequestHandler(WSGIRequestHandler): def log_request(self, code='-', size='-'): # 空实现,不输出访问日志 pass if __name__ == '__main__': app.run(request_handler=SilentRequestHandler)
方法3:启动时重定向输出(不推荐开发用)
如果是命令行启动Flask,可以直接将输出重定向到空设备,但会屏蔽所有Flask日志(包括错误日志):
# Linux/Mac flask run --no-debugger --no-reload 2>&1 >/dev/null # Windows flask run --no-debugger --no-reload >nul 2>&1
内容的提问来源于stack exchange,提问作者user24093926
相关产品推荐
相关产品推荐

