可用 find 命令配合 -mtime +30 清理三类日志目录(/var/log、/Library/Logs、~/Library/Logs),但需避开 Unified Logging 管理区(/var/db/diagnostics 等),并用 sudo log erase 操作;脚本支持预览与定时执行,兼顾安全与自动化。
直接用 find 命令配合 -mtime +30 就能精准定位并删除,但 macos 日志结构分层明显,不能一刀切。重点清理三类路径,同时避开系统统一日志(/var/db/diagnostics)这类受 log 命令管理的区域,否则可能影响诊断功能。
明确可安全清理的目录范围
以下路径中文件大多无自动轮转机制,长期积累易占数 GB 空间:
-
/var/log/:系统级日志归档(如system.log.0.gz、install.log.old) -
/Library/Logs/:全局服务日志(Xcode、Apache、Homebrew 服务等) -
~/Library/Logs/:当前用户应用日志(Slack、Docker Desktop、VS Code 扩展等)
⚠️ 注意:/var/db/diagnostics 和 /var/db/uuidtext 属 Unified Logging 数据库,必须用 sudo log erase 操作,不可用 rm 直删。
脚本核心写法(保留最近30天)
保存为 clean-old-logs.sh,内容如下:
#!/bin/zsh
<p>LOG_DIRS=(
"/var/log"
"/Library/Logs"
"$HOME/Library/Logs"
)</p><p>for dir in "${LOG_DIRS[@]}"; do
if [[ -d "$dir" ]]; then
echo "? 清理 $dir 中 30 天前的日志文件"</p><h1>删除 .log 文件(非正在写入的)</h1><pre class="brush:php;toolbar:false;">find "$dir" -type f -name "*.log" -mtime +30 -delete 2>/dev/null
# 删除压缩归档和旧格式(.gz / .old)
find "$dir" -type f \( -name "*.gz" -o -name "*.old" \) -mtime +30 -delete 2>/dev/nullfi done
echo "✅ 清理完成。建议运行 'du -sh /var/log /Library/Logs ~/Library/Logs' 查看空间释放效果。"
? 关键说明:
-
-mtime +30表示“修改时间超过 30 整天”,即至少 31 天前的文件 -
2>/dev/null屏蔽权限不足等无关报错,保持输出干净 - 运行前可先用
-print替代-delete预览将删哪些文件,例如:find "$dir" -type f -name "*.log" -mtime +30 -print
搭配系统级日志管理更省心
单靠脚本是治标,还需启用 macOS 原生机制减少源头产出:
部署和使用军舰的 macOS Automator 自动化服务集合。包含 5 个实用工作流:PDF转JPG、PNG重命名并转JPG、图像拼接、解压RAR、顺序命名图像文件。一键安装所有服务到 ~/Library/Services/ 目录。使用场景:(1) "安装我的自动化服务",(2) "部署所有 Automato...
- 执行
sudo log config --mode "level:default,mode:stream"确保 Unified Logging 正常工作 - 对常用开发工具(如 Docker、Node.js 进程),启动时加
--log-level=warn或配置其自身日志保留策略 - 检查
/etc/newsyslog.conf是否启用轮转(默认开启),避免/var/log下日志无限膨胀
定时执行只需一条 cron
让脚本每月1号凌晨自动跑一次:
crontab -e # 添加这一行: 0 3 1 * * /path/to/clean-old-logs.sh >/dev/null 2>&1
其中 0 3 1 * * 表示每月1日 3:00 执行;/path/to/... 替换为你脚本的实际路径;重定向确保不产生邮件通知。
不复杂但容易忽略细节,关键在区分日志类型、留出预览步骤、再配好定时节奏。










