我需要一种方法将libcurl在stderr上生成的日志写入文件。 我发现这是一个常见的问题,例如下面的问题,
http://curl.haxx.se/mail/lib-2002-04/0051.html
但我相信这会将实际数据写入文件,而不是基础日志。
我需要从stderr下面的日志,而不是写入文件。
关于connect()到IP.IP.IP.IPa端口22(#0)尝试IP.IP.IP.IPa ... ==信息:已连接已连接到IP。。< / strong>。 (**。。。 )端口 22(#0)
......等
连接#0到主机IP.IP.IP.IPa保持原样 检索到34个字节 关闭连接#0
我也调查了debug.c, http://curl.haxx.se/libcurl/c/debug.html
使用以下选项
curl_easy_setopt(curl_handle, CURLOPT_DEBUGFUNCTION, my_trace);
curl_easy_setopt(curl_handle, CURLOPT_DEBUGDATA, &config);
但是,这又提供了有关传输的实际数据的更多信息。它没有显示有关连接,身份验证等的任何信息。
请注意,我没有使用命令行工具。
编辑:事实证明,由于存在多个线程,stderr / stdout的重定向对于我的应用程序来说不是可接受的解决方案。
答案 0 :(得分:1)
使用curl_easy_setopt(curl_handle, CURLOPT_DEBUGFUNCTION, my_trace)
会将libcurl打印的所有消息重定向到此stderr
,而不是#{1}}。然后,您可以根据需要处理my_trace
功能中的消息。
如果你已经尝试过并且仍然看到消息被打印到stderr
那么可能是因为两个原因:1)你创建了多个libcurl句柄而你没有设置{{ 1}}关于所有这些或2)libcurl以外的东西正在打印消息。
由于您只想将libcurl的调试消息重定向到文件,您也可以执行CURLOPT_DEBUGFUNCTION
,但如果curl_easy_setopt(curl_handle, CURLOPT_STDERR, my_file_stream)
不起作用,那么这也不会。
答案 1 :(得分:1)
根据Ross Ridge的回答,以下C代码为我工作
/* open file for writing */
FILE *file_debug=NULL;
file_debug = fopen("/localhome/username/file.txt", "a+"); //open the specified file on local host
curl_easy_setopt(curl_handle, CURLOPT_STDERR,file_debug);
之后 curl_easy_perform(手柄); 你可以做 fclose(file_debug);
答案 2 :(得分:0)
从aruisdante的评论中得出,这个问题可以通过重定向stdout来写入文件来解决libcurl之外的问题。
我在下面发布了一个示例解决方案(参考:http://codewiki.wikidot.com/c:system-calls:dup2)
int file = open("/path/to/file.txt", O_APPEND | O_WRONLY);
dup2(file, 2); //1 for stdout and 2 for stderr
但对于多线程应用程序,这不适用。