在 Linux 下切割(拆分)大日志文件,常见做法有 按大小切割、按行数切割、按时间切割。下面按使用场景给你一套实用方案。
splitsplit -b 100M big.log big.log.part.
解释:
-b 100M:每个文件 100MBbig.log:原日志big.log.part.:输出前缀生成文件示例:
big.log.part.aa
big.log.part.ab
big.log.part.ac
split -b 100M --numeric-suffixes big.log big.log.part.
split -l 100000 big.log big.log.part.
sed 按时间范围截取假设日志格式:
2025-01-01 10:00:00 xxx
截取某天日志:
sed -n '/2025-01-01/,/2025-01-02/p' big.log > 2025-01-01.log
⚠️ 注意:结束时间必须真实存在,否则会一直匹配到文件末尾。
awk(更精确)awk '/^2025-01-01/' big.log > 2025-01-01.log
logrotate(生产环境标准)示例配置 /etc/logrotate.d/myapp:
/var/log/myapp.log {
size 100M
rotate 7
compress
missingok
notifempty
copytruncate
}
说明:
size 100M:超过 100M 切割rotate 7:保留 7 份compress:gzip 压缩copytruncate:不重启服务zcat big.log.gz | split -l 50000 - big.part.
ls -lh big.log.part.*
wc -l big.log.part.*
❌ 直接 rm 大日志(程序还在写)
✅ 用 logrotate 或 : > big.log
❌ 直接 cp 正在写入的日志
✅ 用 rsync 或 logrotate
| 场景 | 推荐方式 |
|---|---|
| 临时分析 | split |
| 按时间 | awk / sed |
| 生产环境 | logrotate |
| 超大文件 | split -b |
如果你愿意,可以把 日志格式 / 文件大小 / 是否正在写入 发我,我可以给你一条最合适的具体命令。