如何找到Golang程序中向stderr的流氓写入发生在哪里?

时间:2019-03-01 23:13:39

标签: go

我有一个相当大的Golang程序,具有很多依赖项。某处,有人将流氓数据写入stderr。

我想找到写入发生的位置,以便将其删除。

我知道我可以使用Dup2和Pipes拦截stderr,因此我可以检测发生的写操作;但这不能让我从goroutine进行写操作时得到堆栈。

在其他语言中,我将os.Stderr设置为具有钩子Write函数的自定义文件。我不知道有没有办法在Go中做到这一点?如果没有,那么找到该方法调用发生位置的好方法是什么?

1 个答案:

答案 0 :(得分:1)

您可以通过向log.SetOutput提供<script type="application/javascript" > $(document).ready(function(){ $('#search').on('click',function(){ $.ajax({ url: 'http://localhost:8080/api/movies', method: 'GET', dataType: 'json', success: function(data){ $.each(data, function(index, val){ $('#movies').append($('<li>').text('title: ' + val.title + ', year: ' + val.year )); }); } }); }); }); </script> 来拦截日志记录。在那里,您可以简单地检查所记录的字符串是否是跟踪和将stacktrace写入委托包装的writer所需的字符串。

这里是一个例子 游乐场:https://play.golang.org/p/2bClt2JBuFs

请注意,获取当前的堆栈跟踪不是免费的,它会导致世界停止运行,并可能极大降低应用程序的运行速度。如果您的应用程序产生大量日志,我建议您限制要跟踪的数据量(例如,仅跟踪第一个匹配项或每秒/分钟N次)

io.Writer