如何解決printf日誌輸出延遲問題

最近遇到個問題,程序直接運行時,可以及時刷新printf的輸出,但當重定向到log文件時,存在一個3分鐘左右的延遲。問題出在printf涉及到緩衝機制上,緩衝區會在以下5種情況下刷新:

  • 使用fflush(stdout)強制刷新標準輸出緩衝區
  • 緩衝區已滿
  • scanf()要在緩衝區裏取數據時會先將緩衝區刷新
  • \n進入緩衝區時
  • 程序結束時

一般stdout是行緩衝機制,遇到\n就刷新緩衝區,如果將輸出重定向到文件,那麼\n不會刷新,得等到緩衝區滿才刷新,這時候就會出現log延遲的問題。怎麼辦呢?其實也好辦,可以通過以下方法解決:

  1. setvbuf(stdout,NULL,_IONBF,0); 在整個項目中禁止緩存的功能
  2. fflush(stdout); 在需要強制刷新緩存時,調用fflush一次性刷新緩衝區
  3. stderr是無緩衝機制,不用經過fflush或exit,就直接打印出來。可以用來替換stdout輸出warning或者error,及時提醒運維人員處理可能的系統異常。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章