可用 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 直删。
保存为 clean-old-logs.sh,内容如下:
#!/bin/zsh
LOG_DIRS=( "/var/log" "/Library/Logs" "$HOME/Library/Logs" )
for dir in "${LOG_DIRS[@]}"; do if [[ -d "$dir" ]]; then echo "? 清理 $dir 中 30 天前的日志文件"
删除 .log 文件(非正在写入的)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/null
fi 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 原生机制减少源头产出:
sudo log config --mode "level:default,mode:stream" 确保 Unified Logging 正常工作--log-level=warn 或配置其自身日志保留策略/etc/newsyslog.conf 是否启用轮转(默认开启),避免 /var/log 下日志无限膨胀让脚本每月1号凌晨自动跑一次:
crontab -e# 添加这一行:0 3 1 * * /path/to/clean-old-logs.sh >/dev/null 2>&1
其中 0 3 1 * * 表示每月1日 3:00 执行;/path/to/... 替换为你脚本的实际路径;重定向确保不产生邮件通知。
不复杂但容易忽略细节,关键在区分日志类型、留出预览步骤、再配好定时节奏。