2、日志采集工具:journalctl命令详解、tail与grep实战、logrotate配置
日志采集,说白了就是给Ollama装个“黑匣子”。
机器出问题了,你总得知道它死前说了什么吧?我个人习惯,先把日志采集工具玩透,再谈监控。今天咱们就聊聊三个最趁手的家伙:journalctl、tail+grep、还有logrotate。
2.1 journalctl:systemd时代的日志瑞士军刀
如果你的Ollama是用systemd管理的(大部分Linux发行版都是),那journalctl就是你的第一道防线。它直接从systemd-journald读取二进制日志,比翻文本文件快得多。
2.1.1 基本用法
先看Ollama的日志,最简单的命令:
journalctl -u ollama
这会把ollama服务所有的日志都倒出来。嗯,信息量很大,但别慌,我们加几个参数就好用了。
我常用的几个组合:
- 只看最近10分钟:
journalctl -u ollama --since "10 min ago" - 实时跟踪:
journalctl -u ollama -f(跟tail -f一个意思) - 只看错误级别:
journalctl -u ollama -p err - 只看今天:
journalctl -u ollama --since today
-p err 过滤错误,再 -f 实时看新日志。这样能快速定位到异常点。
2.1.2 按时间范围精确查询
有一次,Ollama在凌晨3点突然挂了。我第二天早上才看到,怎么办?
journalctl -u ollama --since "2025-01-15 03:00:00" --until "2025-01-15 03:30:00"
这样就把那半小时的日志精准抓出来了。时间格式支持很多种,比如 "yesterday"、"1 hour ago",非常灵活。
2.1.3 输出格式控制
默认输出是分页的,但如果你要导出分析,可以改格式:
journalctl -u ollama -o json-pretty
输出JSON格式,方便用jq等工具处理。我个人更喜欢 -o short,简洁明了。
2.2 tail与grep实战:文本日志的黄金搭档
journalctl虽好,但Ollama自己也会写日志文件(比如 ~/.ollama/logs/server.log)。这时候,tail和grep就是你的左右手。
2.2.1 tail:实时监控与快速查看
最常用的场景:
tail -f ~/.ollama/logs/server.log
实时滚动日志,看模型加载、推理请求、错误信息。我调试新模型时,经常开着这个窗口。
其他实用参数:
tail -n 100 server.log:只看最后100行tail -f -n 50 server.log:从最后50行开始实时跟踪
2.2.2 grep:大海捞针
日志文件动辄几百MB,你不可能一行行翻。grep就是你的搜索利器。
实战场景:
# 查找所有包含 "error" 的行(忽略大小写)
grep -i "error" server.log
# 查找包含 "timeout" 的行,并显示前后5行上下文
grep -C 5 "timeout" server.log
# 统计某个错误出现的次数
grep -c "OOM" server.log
我曾经踩过的坑:有一次Ollama频繁重启,我直接 grep "error" 没找到关键信息。后来用 grep -i "warn\|fail\|crash" 才发现了内存不足的警告。所以,别只搜"error",多试试其他关键词。
2.2.3 tail + grep 组合拳
实时监控并过滤:
tail -f server.log | grep --line-buffered "error"
--line-buffered 参数很重要,它让grep每读到一行就输出,而不是攒一堆再输出。否则你会看到日志延迟。
2.3 logrotate:日志轮转,别让硬盘爆了
日志如果不管理,几天就能吃掉几个GB。logrotate就是帮你自动切割、压缩、清理日志的工具。
2.3.1 配置Ollama的日志轮转
假设Ollama的日志在 /var/log/ollama/ 目录下,我们创建一个配置文件:
sudo vim /etc/logrotate.d/ollama
写入以下内容:
/var/log/ollama/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
copytruncate
}
解释一下每个参数:
| 参数 | 含义 |
|---|---|
daily |
每天轮转一次 |
rotate 7 |
保留最近7个轮转文件 |
compress |
轮转后压缩(gzip) |
delaycompress |
延迟压缩,保留一个未压缩的版本 |
missingok |
日志文件不存在也不报错 |
notifempty |
空文件不轮转 |
copytruncate |
先复制再清空原文件(适合持续写入的日志) |
copytruncate 而不是 create。否则日志文件被删除后,Ollama可能找不到文件句柄,导致写日志失败。我曾经因为这个丢过半小时的日志,血的教训。
2.3.2 手动测试与强制轮转
配置完别急着等明天,先手动测试一下:
sudo logrotate -d /etc/logrotate.d/ollama
-d 是debug模式,只模拟不执行。确认没问题后,强制轮转:
sudo logrotate -f /etc/logrotate.d/ollama
2.3.3 查看轮转状态
轮转后的日志文件会变成 server.log.1.gz、server.log.2.gz 等。查看当前状态:
cat /var/lib/logrotate/status | grep ollama
这里记录了上次轮转的时间。如果发现没按预期轮转,检查一下cron任务是否在运行:
systemctl status logrotate.timer
知识体系总览
下面这张图,帮你理清这三个工具的关系:
说白了,journalctl管系统服务日志,tail+grep管文本日志的实时分析,logrotate管日志的“新陈代谢”。三者配合好了,Ollama出任何问题你都能快速定位。
嗯,工具就这些。但记住,工具是死的,思路是活的。下次遇到Ollama异常,先问自己三个问题:日志在哪?怎么查?怎么防止它撑爆硬盘?想清楚这些,你就入门了。