詞彙表/你會看到的程序

logd

又稱:統一記錄

簡短回答

logd是執行統一記錄的macOS程序,統一記錄是macOS和你的App在執行時所回報內容的全系統記錄。每個程序都會把記錄訊息交給logd,logd會將其壓縮,把最近的訊息留在記憶體中,其餘的存到磁碟上的記錄儲存區,「主控台」App和「終端機」中的log指令就是從那裡讀取。

logd只有一個,以root執行,在Mac開機時由launchd啟動。從macOS Sierra開始,大部分訊息不再寫入/var/log中的文字檔。App會把訊息交給logd,logd以壓縮的二進位格式將其儲存在/var/db/diagnostics,每則訊息的固定文字則保存在/var/db/uuidtext。這就是為什麼你要用「主控台」或log指令讀取記錄,而不是打開某個檔案。

它的CPU和磁碟用量取決於Mac其他部分寫入多少記錄。在安靜的Mac上,它只用不到百分之一。當logd排在列表前面時,幾乎從來不是logd自己的問題:而是另一個程序寫入訊息的速度比平常快得多,logd只是在負責儲存這些訊息。

logd為什麼使用這麼多CPU或磁碟

某個App或背景程序正在循環寫入記錄。一個每秒失敗並重試多次的程序,例如連不上伺服器的網路程式、卡住的同步,或反覆回報同一個錯誤的驅動程式,每分鐘可能寫下數十萬則訊息。logd會壓縮並儲存每一則,它的CPU和「寫入位元組」也會隨之上升。

為了排解問題而開啟的額外記錄也有同樣的效果。為錯誤回報而安裝的記錄描述檔,或用log config指令所做的變更,會讓logd儲存平常只保留在記憶體中的訊息。

該怎麼處理

找出大量灌爆記錄的程序,處理那個程序,而不是logd。在「終端機」中,log stats --last 5m會依過去五分鐘內寫入的記錄量為程序排名。結束或更新排在最前面的App;如果是卡住的背景程序,請重新啟動Mac。

如果你安裝過已不再需要的記錄描述檔,請在「系統設定」→「一般」→「裝置管理」中將其移除。結束logd沒有幫助:macOS會立刻再次啟動它,而灌爆記錄的程序也會繼續下去。

如何找出大量寫入記錄的程序

logd只負責儲存,所以真正該問的是誰在寫入。活動監視器顯示代價,「終端機」則能揪出元凶。

  1. 打開活動監視器,按一下「CPU」標籤頁,選擇「顯示方式」→「所有程序」,然後在搜尋欄位中輸入logd。記下它的「% CPU」。
  2. 按一下「磁碟」標籤頁,觀察logd的「寫入的位元組」。數字攀升得很快,表示它正把大量訊息存到磁碟上。
  3. 清除搜尋欄位,在「CPU」標籤頁中依「% CPU」排序。大量寫入記錄的程序本身通常也很忙,而且可能一再重新啟動,每次都換一個新的PID。
  4. 打開「終端機」並執行log stats --last 5m。它會在processes底下列出過去五分鐘內寫入記錄最多的程序,以及各自的事件數和位元組數。WindowServer和其他幾個系統程序在每台Mac上都會寫入大量記錄,所以要找的是佔比異常的程序,或是本來應該閒置的程序。
  5. 想看那個程序在說什麼,就執行log show --last 5m --predicate 'process == "Name"',把Name換成程序名稱。想即時觀看,就用相同述詞執行log stream,按下Control-C即可停止。

logd的正常用量與異常情況

正常:logd的CPU用量維持在幾個百分點以下,在Mac啟動、從睡眠中喚醒,或同時打開很多App時會短暫升高。

值得檢查:logd一連好幾分鐘都排在CPU列表前面,或是你沒做什麼事,它的「寫入的位元組」卻一直快速增加。常見原因如下:

  • 某個程序失敗後在密集的迴圈中不斷重試,例如連不上伺服器的網路程式,或卡住的同步。
  • 某個輔助程式當掉後立刻又被啟動,每次都記錄同樣的啟動和失敗訊息。
  • 用log config開啟了除錯或資訊層級的記錄,或為了提交錯誤報告而安裝了記錄描述檔。
  • 某個App在自己的設定中開啟了詳細記錄,或某個App的測試版會記錄所有內容。
  • 「主控台」一直開著即時串流,或某個工具始終在讀取即時記錄。這部分代價主要出現在logd的搭檔diagnosticd上。

在「主控台」中查看記錄

「主控台」位於「應用程式」→「工具程式」,會在視窗中顯示同樣的記錄。按一下工具列中的「開始」,就能看到即時傳來的訊息;在搜尋欄位中輸入程序名稱,就只會顯示提到它的訊息。當某個程序洗版的速度快到你來不及讀,你就找到讓logd忙碌的原因了。

看完後請停止串流。「主控台」顯示即時記錄時,diagnosticd和寫入記錄的程序都會多做額外的工作,這對一台已經很忙的Mac來說正好適得其反。

大家常問的問題

Mac上的logd是什麼?

它是統一記錄背後的macOS程序。每個App和系統程序都會把記錄訊息傳給logd,logd會將其壓縮並儲存,讓「主控台」和log指令可以顯示。

logd的CPU用量為什麼很高?

幾乎都是因為另一個程序正在循環寫入記錄訊息,而logd必須把它們全部存下來。在「終端機」中執行log stats --last 5m,看看是哪個程序寫入最多記錄。

可以刪除logd保存的記錄嗎?

可以,但很少有理由這樣做。記錄儲存區達到大小上限時,macOS會自行清除舊的訊息,所以它不會無限增長。如果你需要清除,sudo log erase --all會移除已儲存的訊息,連同你或Apple支援人員診斷問題時所需的歷史記錄一併移除。不要手動刪除/var/db/diagnostics或/var/db/uuidtext。

Mac上的diagnosticd是什麼?

它是統一記錄系統的另一部分。logd負責儲存訊息,diagnosticd則把訊息即時傳給「主控台」和log stream。只有在其中之一顯示即時記錄時,它才會使用較多CPU。

結束logd安全嗎?

不會造成長久的傷害,因為macOS會立刻再啟動它,但也沒有任何好處。大量寫入記錄的程序會繼續下去,logd一重新啟動就會再接手工作。

相關詞條

想找比活動監視器更好的工具?請參閱Mac上最好用的活動監視器替代方案,或瀏覽詞彙表中的所有詞條。