2011-05-27 19 views
1

我正在查看控制檯上的error_logger消息,並將它們同時存儲在帶有error_logger_mf的文件中。爲什麼控制檯上的error_logger消息與error_logger_mf文件的順序不同

如果我查看文件和控制檯,這些消息的順序完全不同。

時間戳都顯示相同的值,所以它的速度非常快,我明白,從不同的進程發送的消息可能會失序。

但我一直認爲,一旦達到error_logger,它們在發送到不同的事件處理程序時保持相同的順序。

我在文件中看到的內容(當我用rb來看)時,事件以比控制檯上更爲理智的順序出現。

澄清:

很顯然,在來自不同進程的消息在error_logger到達的順序是不被採取太嚴重。

當我將磁盤日誌與屏幕日誌進行比較時,我不明白的是順序上的差異。


添加了一個答案作爲社區維基與我在下面的部分調查結果,請編輯,如果你知道額外的點。

+0

這是一個同步競爭,以獨佔方式抓取IO控制檯。或者至少這是我的猜測。在那裏可能會出現一個產卵,這使得多個人想要訪問控制檯,因此這是誰先抓住IO鎖的問題。 – 2011-05-28 12:04:35

+0

@IG:檢查錯誤記錄器處理程序到tty的路徑,找不到任何證據(請參閱下面的c.wiki)。 – 2011-05-28 16:36:53

回答

0

更新:這仍然是尚未解決的,覺得免費的,如果你知道要添加到這個社會的維基東西

有沒有一些挖掘的來源,但沒有解決的謎至今:

看着到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.erl其中io:format將其io_request我們有一個服務器循環中調用的,最終的文本發送到TTY端口功能的級聯。

在任何時候都不會有消息從多個進程發送!

所以我看不到任何消息改變順序,而旅行到tty的方式。

根據消息是發送給tty還是發送給mf,報告的順序在哪裏可以改變?

相關問題