golang :在空闲 HTTP 通道上收到的主动响应以开头

Ste*_*nte 5 go

这是我的实际代码:

func cURL(cURL string, follow bool) (*string, error) {
    var err error
    var resp *http.Response
    var req *http.Request

    var u *url.URL
    if u, err = url.Parse(cURL); nil != err {
        if logLevel >= 30 {
            log.Print("ERROR: ", err)
        }
        return nil, err
    }

    if req, err = http.NewRequest("GET", u.Scheme+"://"+u.Host+u.Path, nil); err != nil {
        if logLevel >= 40 {
            log.Print("ERROR: ", err)
        }
        return nil, err
    }
    req.URL.RawQuery = u.RawQuery

    client := &http.Client{
        Timeout: 3 * time.Second,  //timeout connexion
    }
    if resp, err = client.Do(req); nil != err {
        if logLevel >= 50 {
            log.Print("ERROR: ", err)
        }
        return nil, err
    }
    defer resp.Body.Close()

    var body []byte
    if body, err = ioutil.ReadAll(resp.Body); nil != err {
        if logLevel >= 30 {
            log.Print("ERROR: ", err)
        }
        return nil, err
    }

    var html string
    html = string(body)

    return &html, nil
}
Run Code Online (Sandbox Code Playgroud)

同时在终端中打印此错误,我想隐藏它:

2017/09/29 18:19:28 Unsolicited response received on idle HTTP channel starting with "HTTP/1.0 408 Request Time-out\r\nServer: AkamaiGHost\r\nMime-Version: 1.0\r\nDate: Fri, 29 Sep 2017 16:18:21 GMT\r\nContent-Type: text/html\r\nContent-Length: 218\r\nExpires: Fri, 29 Sep 2017 16:18:21 GMT\r\n\r\n<HTML><HEAD>\n<TITLE>Request Timeout</TITLE>\n</HEAD><BODY>\n<H1>Request Timeout</H1>\nThe server timed out while waiting for the browser's request.<P>\nReference&#32;&#3
Run Code Online (Sandbox Code Playgroud)

我想隐藏此错误,而不是在终端中打印,我该怎么做?我哪里错了?如果有特定关键字,我使用此功能检查大型列表网址,该列表真的很大 5000 万个网址。

eso*_*ote 1

该消息来自http.Transport内部http.Client,特别是这里

log.Printf("Unsolicited response received on idle HTTP channel starting with %q; err=%v", buf, peekErr)
Run Code Online (Sandbox Code Playgroud)

不幸的是,与它不同的是,http.Server它有一个ErrorLog用于覆盖默认记录器的字段,http.Transport它总是写入标准记录器。

要防止打印消息,您可以在 1.16 之前使用log.SetOutput(io.Discard)或。log.SetOutput(ioutil.Discard)请记住,这将丢弃写入标准记录器的所有内容。正如 JimB 提到的,如果您仍然想在其他地方登录,您可以创建一个自定义记录器