2013-02-27 114 views
5

我有一個問題,我不能在stackoverflow或web上找到任何幫助。我有一個程序(芹菜分佈式任務隊列),我有多個實例(工人),每個有一個日誌文件(celery_worker1.log,celery_worker2.log)。記錄到非阻塞命名管道?

重要的錯誤存儲在數據庫中,但我喜歡在運行新操作時不時確定這些日誌,以確保一切正常(日誌級別較低)。

我的問題:這些日誌佔用大量的磁盤空間。 我想做什麼:只有當我需要它時,才能「看」日誌(tail -f),而不需要佔用大量空間。

我的想法到現在爲止:

  • outputing日誌到標準輸出,而不是一個文件:不可能在這裏,因爲我有很多工人outputing到不同的文件,但我想尾部一次全部(尾 - f celery_worker * .log)
  • 使用logrotate:對我來說這是一個「OK」解決方案。我不希望這是一個日常任務,但寧願不要把這個分鐘的crontab,而更多的是,服務器不是我的,所以這將意味着使用命名管道在管理系統端
  • 一些工作:它看起來一見鍾情,但我不知道那個命名管道(linux FIFO)在哪裏阻塞。因此,當我不同時尾巴所有管道時,或者當我剛剛退出尾巴時,記錄器的寫入操作將被阻止。

有沒有辦法建立一個非阻塞的命名管道,當只有拋出時stdout拋出,並拋出/ dev/null時,不是?

或者這種類型的管道是否存在技術難題?如果有,它們是什麼?

謝謝你的回答!

+0

可能重複的[Linux非阻塞FIFO(按需日誌記錄)](http://stackoverflow.com/questions/7360473/linux-non-blocking-fifo-on-demand-logging) – 2015-01-29 21:26:32

回答

1

讓每個工作人員登錄到stdout,但將每個stdout連接到一個實用程序,該實用程序會根據大小或時間自動後臺打印和旋轉日誌。 multilogsvlogd就是這樣的例子。對於那些程序,你只需要尾隨「當前」日誌文件。

您說得對,logrotate對於您遇到的問題並不完全正確。

命名管道將無法正常工作。充其量,你的作者可以填滿他們的管道,然後丟棄隨後的日誌,這與你想要的行爲相反。

+0

謝謝@pilcrow爲你的答案。所有5名員工都通過一個命令在後臺啓動,我不想擁有一個總是打開標籤的屏幕,那麼如何讓他們登錄到不同的標準輸出? 你是否確認「非阻塞命名管道在未讀取時重定向到/ dev/null」不存在這樣的情況? 謝謝 – 2013-02-27 22:38:25

+0

@noe,關於共享或單獨的標準輸出...取決於。我們對他們的調用不夠了解。關於這種命名管道語義不存在,是正確的。 – pilcrow 2013-02-28 03:08:53

1

你可以嘗試共享內存設備man:shm_overview或者其中的一些。您需要將它們組織爲循環緩衝區,以便它們可以存儲最後N KB的日誌,並且每當您用讀取器讀取它們時,它都會將所有內容輸出到控制檯。 busybox的系統日誌/日誌套裝採用這種方法(請參閱logread.c)。