簡體   English   中英

記錄到非阻塞命名管道?

[英]Logging to a non blocking named pipe?

我有一個問題,我無法在stackoverflow或網絡上的任何地方找到幫助。

我有一個程序(芹菜分布式任務隊列),我有多個實例(工人),每個實例都有一個日志文件(celery_worker1.log,celery_worker2.log)。

重要的錯誤存儲在數據庫中,但我喜歡在運行新操作時不時地拖尾這些日志以確保一切正常(loglevel更低)。

我的問題:這些日志占用了大量磁盤空間。 我想做什么:能夠只在我需要時“觀察”日志(tail -f),而不需要占用大量空間。

我的想法到現在為止:

  • 輸出日志到stdout,而不是文件:這里不可能,因為我有很多工人輸出到不同的文件,但我想一次拖尾它們(tail -f celery_worker * .log)
  • 使用logrotate:對我來說這是一個“OK”的解決方案。 我不希望這是一個日常任務,但寧願不為此花一分鍾crontab,而且更多,服務器不是我的,所以這意味着在admin-sys方面的一些工作
  • 使用命名管道:它一見鍾情,但我不知道命名管道(linux FIFO)阻塞。 因此,當我不同時尾隨-f所有管道,或者當我剛退出尾部時,記錄器的寫入操作被阻止。

有沒有辦法有一個非阻塞的命名管道,它會在尾部時拋出stdout,並在沒有時拋出/ dev / null?

或者這種管道有技術難題嗎? 如果有,他們是什么?

謝謝您的回答!

讓每個工作人員登錄到stdout,但將每個stdout連接到一個實用程序,該實用程序根據大小或時間自動調整和旋轉日志。 multilogsvlogd就是這樣的例子。 對於那些程序,您只需拖尾“當前”日志文件。

你是對的,logrotate不是解決問題的正確方法。

命名管道將無法正常工作。 最好的情況是,你的作者可以填滿他們的管道然后丟棄后續日志,這與你想要的行為相反。

您可以嘗試共享內存設備man:shm_overview或者其中一些。 您需要將它們組織為循環緩沖區,以便它們存儲日志的最后N kb,每當您使用閱讀器讀取它們時,它都會將所有內容輸出到您的控制台。 busybox的syslog / logread訴訟采用了這種方法(參見logread.c )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM