【问题标题】:Why are error_logger messages in different order on the console compared to error_logger_mf file与 error_logger_mf 文件相比,为什么控制台上的 error_logger 消息顺序不同
【发布时间】:2011-09-03 17:00:34
【问题描述】:

我正在控制台上查看 error_logger 消息,并将它们同时存储在带有error_logger_mf 的文件中。

如果我查看文件和控制台,消息的顺序完全不同。

时间戳都显示相同的值,所以它运行得非常快,而且我知道从不同进程发送消息时可能会出现乱序。

但我一直认为,一旦到达 error_logger,当它们被发送到不同的事件处理程序时,它们会保持相同的顺序。

我在文件中看到的(当我使用rb 查看它时)事件以比控制台上更合理的顺序出现。

澄清:

很明显,不同进程的消息到达error_logger的顺序不要太认真。

我不明白的是顺序的区别,当我比较磁盘日志和屏幕日志时。


在社区 wiki 中添加了我的部分发现的答案,如果您知道其他要点,请进行编辑。

【问题讨论】:

  • 独占IO控制台是一场同步竞赛。或者至少这是我的猜测。那里可能有一个 spawn 让多个人想要访问控制台,因此这是谁先获取 IO 锁的问题。
  • @IG:检查了从错误记录器处理程序到 tty 的路径,但找不到任何证据(参见下面的 c.wiki)。

标签: erlang error-logging


【解决方案1】:

更新:这仍未解决,如果您知道的话,请随时添加到此社区 wiki 中

在源头上做了一些挖掘,但到目前为止还没有解决这个谜题:

查看了应该负责向控制台输出的error_logger_tty_h.erl

handle_event({_Type, GL, _Msg}, State) when node(GL) =/= node() ->
    {ok, State};
handle_event(Event, State) ->
    write_event(tag_event(Event)),
    {ok, State}.

因此,在另一个节点上具有 group_leader 的事件将被忽略,所有未被忽略的事件都通过 write_event/1 传递。它会进行一些格式化,然后输出结果:

format(String)       -> io:format(user, String, []).
format(String, Args) -> io:format(user, String, Args).

user.erlio:format 发送它的io_request,我们有一个服务器循环调用一系列函数,最终将文本发送到tty 端口。

绝不会从多个进程发送消息!

因此,在前往 tty 时,我看不到消息更改顺序的任何方式。

根据消息是发送到 tty 还是发送到 mf,报告的顺序还有哪些变化?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-16
    • 1970-01-01
    • 2010-12-06
    相关资源
    最近更新 更多