2、日志采集工具:journalctl命令详解、tail与grep实战、logrotate配置

日志采集,说白了就是给Ollama装个“黑匣子”。

机器出问题了,你总得知道它死前说了什么吧?我个人习惯,先把日志采集工具玩透,再谈监控。今天咱们就聊聊三个最趁手的家伙:journalctltail+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,简洁明了。

注意:journalctl默认只保留最近的日志(取决于系统配置)。如果日志被轮转或清理了,就查不到了。所以,重要日志建议同时写到文件里。

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 先复制再清空原文件(适合持续写入的日志)
特别注意:如果Ollama正在写日志,用 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.gzserver.log.2.gz 等。查看当前状态:

cat /var/lib/logrotate/status | grep ollama

这里记录了上次轮转的时间。如果发现没按预期轮转,检查一下cron任务是否在运行:

systemctl status logrotate.timer

知识体系总览

下面这张图,帮你理清这三个工具的关系:

日志采集工具知识体系 journalctl systemd日志查询 tail + grep 文本日志实时分析 logrotate 日志轮转与清理 核心功能 • 按服务过滤 (-u) • 按时间范围 (--since/--until) • 按日志级别 (-p) • 实时跟踪 (-f) 核心功能 • 实时监控 (-f) • 关键字搜索 (grep -i) • 上下文显示 (-C) • 组合管道 (| grep) 核心功能 • 按天/周/月轮转 • 自动压缩 (compress) • 保留数量控制 (rotate) • copytruncate模式 三者配合:采集 → 分析 → 管理,形成日志闭环

说白了,journalctl管系统服务日志,tail+grep管文本日志的实时分析,logrotate管日志的“新陈代谢”。三者配合好了,Ollama出任何问题你都能快速定位。

嗯,工具就这些。但记住,工具是死的,思路是活的。下次遇到Ollama异常,先问自己三个问题:日志在哪?怎么查?怎么防止它撑爆硬盘?想清楚这些,你就入门了。


专注资料整理