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只负责存储,所以真正该问的是谁在写入。活动监视器显示代价,“终端”则能揪出元凶。
- 打开活动监视器,点按“CPU”标签页,选取“显示”→“所有进程”,然后在搜索栏中输入
logd。记下它的“% CPU”。 - 点按“磁盘”标签页,观察logd的“写入字节”。数值攀升得很快,说明它正在把海量消息存到磁盘上。
- 清空搜索栏,在“CPU”标签页中按“% CPU”排序。刷屏日志的进程本身往往也很忙,而且可能在反复重启,每次都换一个新的PID。
- 打开“终端”并运行
log stats --last 5m。它会在processes下列出过去五分钟内记录日志最多的进程,以及各自的事件数和字节数。WindowServer和其他几个系统进程在每台Mac上都会记录大量日志,所以要找的是占比异常的进程,或者本该闲置的进程。 - 要读那个进程在说什么,运行
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上最好用的活动监视器替代品,或者浏览术语表中的所有条目。