libcurl verbose输出到文件,不使用命令行

时间:2014-08-15 16:31:34

标签: c libcurl

我需要一种方法将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的重定向对于我的应用程序来说不是可接受的解决方案。

3 个答案:

答案 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

但对于多线程应用程序,这不适用。