2017-08-04 72 views
1

用我golang网/ HTTP服务器,我偶尔会得到如下的错误如何处理低级网络/ http错误?

2017/08/04 15:06:25 http: Accept error: accept tcp 127.0.0.1:80: accept4: too many open files; retrying in 1s

的标准错误。有可能是一个缺少Close()某处的错误,但这是而不是我的问题是关于。

我想知道的是,是否有一种简单的方法来以编程方式捕获这些或类似的错误? 我只知道这个错误,因为它被记录了。 ListenAndServe()不会返回错误。有没有其他的方式来得到像这样的错误的通知? 具体来说:我如何访问底层侦听器的错误? ListenAndServe()不会从底层侦听器返回错误(至少不是所有这些错误)。

(编辑)

+2

你指的是什么其他“类似这些错误”?你是否特意要拦截“Accept”调用,如果你这样做了,除了记录和重试之外,你甚至会怎么处理这个错误? – JimB

+1

可能的重复[任何方式获取堆栈跟踪'http:response.WriteHeader在劫持连接'错误?](https://stackoverflow.com/questions/43547565/any-way-to-get-a-stack -trace-for-http-response-writeheader-on-hijacked-connect) – Flimzy

+0

我甚至比JimB更进一步,并说这个日志条目确实* whatvit应该做的事情:你检查你是否关闭所有文件,并可能检查为操作系统运行该进程的用户提供的打开文件描述符的最大数量。解决的根本原因是我所称的任务完成。 –

回答

1

如果你看一下(*http.Server).Serve()是如何实现的here,很显然,你可以定义自己的类,它实现net.Listener,并把它交给Serve()功能,而不是使用ListenAndServe(),这使一个默认的监听器那里。使其出现错误panic,然后在代码中出现recover,或执行任何其他错误处理逻辑。

+0

问题不在于从Server()返回的错误,而是仅记录了错误。 – Flimzy

+0

在这种情况下发生的事情是'http.ListenAndServe()'创建默认的'http.Server'并运行'server.Serve()'提供一个默认的'net.Listener'。然后,如果发生“接受错误”(Listener内部),它只会被服务器打印。我提出的是,你定义了你自己的Listener,它只是绕过默认的'net.Listener'并且对错误执行你的定制逻辑。我应该编辑我的答案来说明清楚。 –

+0

这有助于'错误';这个问题不是关于'错误'。 – Flimzy

2

净/ HTTP记录所有错误server.ErrorLog。您可以使用它来拦截日志消息,但是您可以通过编程方式从这些日志获取多少数据并不明显。