什么是 lnav?
lnav,即 Logfile Navigator,是一款终端日志查看器,能把来自多个来源的日志文件合并到一个按时间戳排序的视图中。把几个文件、一个目录或一个压缩包交给它,它会自己识别格式(syslog、systemd 日志、Apache 和 nginx 访问日志、JSON lines 等等),按时间交错排列消息,高亮错误和警告,并在文件增长时持续跟踪。之后你可以过滤、搜索、在错误之间跳转;当问题不是一次搜索能回答的时候,还可以用 SQL 查询日志消息。通过 ssh 打开远程日志和打开本地日志一样简单。lnav 由 Tim Stack 用 C++ 编写,采用 BSD-2-Clause 许可证。
apt upgrade 时就会原地替换发行版自带的 lnav。
⚡ lnav 的主要功能
🔀 一条合并的时间线
同时打开 syslog、应用日志和 Web 服务器日志,lnav 会按时间戳交错排列它们的行,让你按事情发生的顺序阅读整个系统里发生了什么。
🔍 自动识别格式
syslog、journald JSON、Apache 和 nginx 访问日志、JSON lines、logfmt 以及几十种其他格式无需配置即可识别;级别、时间戳和字段都会被解析,错误和警告会被高亮。
🗄️ 用 SQL 查询日志
每种识别出的格式都是一张表。按 ; 就能对日志消息运行 SELECT 查询:按主机统计错误、找出最慢的请求、按状态码分组,结果显示在同一个窗口里。
🌐 通过 ssh 查看远程日志
lnav user@host:/var/log/syslog 借助你平常的 ssh 配置和密钥打开另一台机器上的日志,服务器上无需安装任何代理。
📦 压缩文件与归档
轮转后的 .gz 和 .bz2 日志可以直接打开,.zip 和 .tar 归档也一样,诊断包不用先解压就能阅读。
👀 跟踪、过滤与搜索
文件增长时持续跟踪,过滤器按模式隐藏或保留行,搜索会高亮每一处匹配,单个按键就能跳到下一个错误或警告,重要的内容不会一闪而过。
apt upgrade 就能让你保持最新。
📦 从 deb.griffo.io 安装
第 1 步:添加仓库
sudo install -d -m 0755 /etc/apt/keyrings
curl -fsSL https://deb.griffo.io/EA0F721D231FDD3A0A17B9AC7808B4DD62C41256.asc | sudo gpg --dearmor --yes -o /etc/apt/keyrings/deb.griffo.io.gpg
echo "deb [signed-by=/etc/apt/keyrings/deb.griffo.io.gpg] https://deb.griffo.io/apt $(. /etc/os-release; echo ${DEBIAN_CODENAME:-${UBUNTU_CODENAME:-$VERSION_CODENAME}}) main" | sudo tee /etc/apt/sources.list.d/deb.griffo.io.list > /dev/null
sudo apt updateinstall -d -m 0755 /etc/apt/keyrings
curl -fsSL https://deb.griffo.io/EA0F721D231FDD3A0A17B9AC7808B4DD62C41256.asc | gpg --dearmor --yes -o /etc/apt/keyrings/deb.griffo.io.gpg
echo "deb [signed-by=/etc/apt/keyrings/deb.griffo.io.gpg] https://deb.griffo.io/apt $(. /etc/os-release; echo ${DEBIAN_CODENAME:-${UBUNTU_CODENAME:-$VERSION_CODENAME}}) main" | tee /etc/apt/sources.list.d/deb.griffo.io.list > /dev/null
apt updatesudo apt install extrepo
sudo extrepo enable griffo
sudo apt update🆓 有一个永久免费的镜像。 deb-free.griffo.io 永久免费提供软件包 — 无需账号、无需订阅,最多落后上游 2 个月,安全修复立即发布。目前收录 cliamp、Ghostty、lazydocker、Oh My Posh、Uncloud 和 Zed;lnav 不在其中,因此今天只能通过上面的仓库安装 — 提出请求即可将其加入。
🧩 关于 extrepo 选项。 extrepo 是 Debian 官方用于管理第三方仓库的工具:它会替你写好 sources 文件并安装签名密钥,并在使用前先对照签名元数据校验该密钥。本仓库以 griffo 之名登记其中,永久免费镜像则为 griffo-free,因此在 Debian(bookworm、trixie、forky、sid)上,上面的命令就是全部配置。
extrepo 只负责 sources 文件和密钥,订阅凭据仍然要写入 /etc/apt/auth.conf.d/deb.griffo.io.conf。Ubuntu 不在覆盖范围内,因为 extrepo 只发布 Debian 各套件的元数据:在 Ubuntu 上请使用 sudo 或 root 的命令。
第 2 步:安装 lnav
# 安装最新版 lnav(原地替换发行版自带的旧版 lnav)
sudo apt install lnav
# 验证安装
dpkg -s lnav | grep Version# 安装最新版 lnav(原地替换发行版自带的旧版 lnav)
apt install lnav
# 验证安装
dpkg -s lnav | grep Version第 3 步:第一次运行
# /var/log 下的日志只有 root 和 adm 组可读
sudo lnav /var/log
# 没有 rsyslog(Debian 默认如此)?以 JSON 形式读取 systemd 日志
journalctl -o json | lnav
# 你自己的日志无需 sudo;格式会自动识别
lnav ~/app/logs/
# 在 lnav 中按 ? 查看内置帮助,按 q 退出# /var/log 下的日志只有 root 和 adm 组可读
lnav /var/log
# 没有 rsyslog(Debian 默认如此)?以 JSON 形式读取 systemd 日志
journalctl -o json | lnav
# 你自己的日志无需 sudo;格式会自动识别
lnav ~/app/logs/
# 在 lnav 中按 ? 查看内置帮助,按 q 退出🎯 基本用法示例
阅读和跟踪日志:
# 轮转和压缩过的日志可以直接打开,归档也一样
lnav /var/log/nginx/access.log.2.gz support-bundle.tar.gz
# 多个来源,按时间戳合并成一条时间线
lnav /var/log/nginx/ ~/app/logs/app.log
# 另一台机器上的日志,走你平常的 ssh 配置
lnav user@host:/var/log/syslog过滤与 SQL:
# 在 lnav 中:e / E 跳到下一个 / 上一个错误,w / W 跳到警告
# :filter-in error 只保留匹配的行
# :filter-out healthcheck 隐藏匹配的行
# ;SELECT c_ip, count(*) AS hits FROM access_log GROUP BY c_ip ORDER BY hits DESC
# 不启动界面执行同样的查询,适合脚本
lnav -n -c ';SELECT sc_status, count(*) FROM access_log GROUP BY sc_status' /var/log/nginx/access.log保持最新:
# lnav 随系统其他软件一起更新
sudo apt update && sudo apt upgrade
# 查看已安装的版本以及可用的最新版本
apt policy lnav
# 卸载
sudo apt remove lnav# lnav 随系统其他软件一起更新
apt update && apt upgrade
# 查看已安装的版本以及可用的最新版本
apt policy lnav
# 卸载
apt remove lnav🔧 工具集成
lnav 能读取任何输出文本的东西:文件、管道以及其他机器:
- ssh:像
user@host:/var/log/syslog这样的远程路径会使用你现有的 ssh 配置和密钥;软件包为此推荐安装openssh-client - systemd 日志:把
journalctl -o json(加上-f即可持续跟踪)通过管道交给 lnav,日志的每个字段都可以搜索和查询 - 容器:
docker logs -f app 2>&1 | lnav或kubectl logs -f pod | lnav让容器输出同样获得高亮和 SQL - 剪贴板:标记若干行后按
c即可复制;软件包建议为 Wayland 和 X11 安装wl-clipboard或xclip - 自定义格式:在 JSON 文件中描述内部日志格式,用
lnav -i myformat.json安装;之后它就能被识别、高亮,并拥有自己的 SQL 表 - 脚本与 CI:
lnav -n -c以无界面方式执行命令和查询,交互时回答问题的同一条 SQL 也能在 cron 任务或流水线中运行 - 文档:man 手册页随软件包提供(
man lnav),完整手册位于 docs.lnav.org
🚀 为什么选择 deb.griffo.io?
- 官方 Debian: trixie 提供 lnav 0.12.4,Bookworm 提供 0.11.1,各自在整个版本生命周期内保持冻结
- 上游下载:从 GitHub 发布页下载包含静态二进制文件的 zip,手动复制到 PATH 中,没有 man 手册页,每次发布都得重新下载
- 从源码构建:需要 C++ 工具链以及 SQLite、PCRE2、ncurses、libarchive 和 libcurl 的开发包,以及漫长的编译
- deb.griffo.io: 最新版本,并自动更新
- ✅ 与 Debian 相同的软件包名:软件包名为
lnav,与 Debian 官方仓库中的名称完全一致,因此本仓库会在apt upgrade时原地升级自带的 lnav,之后apt remove也不会留下任何东西 - ✅ 上游官方静态构建:上游自己的 musl 静态二进制文件,完全没有运行时依赖,在每个版本上的表现都一样
- ✅ 完整的软件包:
lnav二进制文件及其 man 手册页,推荐安装openssh-client以查看远程日志,建议安装wl-clipboard或xclip以复制日志行 - ✅ 自动更新: 上游发布后数小时内更新软件包
- ✅ 两种架构: 每个版本都提供 amd64 和 arm64,同一个 lnav 可以运行在服务器、笔记本以及树莓派这样的 ARM 开发板上
- ✅ 多发行版: 支持 Bookworm、Trixie、Forky 和 Sid
- ✅ 易于维护: 使用标准 apt 命令即可更新
📦 软件包构建仓库
Debian 软件包在这个 GitHub 仓库中自动构建和维护:
- 🪵 lnav-debian - 最新版本构建
🔗 相关软件包
deb.griffo.io 同样提供:
- lazydocker - Docker 的终端界面,用来找到你需要查看日志的容器
- k9s - Kubernetes 集群及其 Pod 的终端界面
- ripgrep - 快速的递归搜索,一次 grep 整个日志目录树
- bottom - 终端系统监视器,查看日志不会告诉你的信息
- fzf - 模糊查找器,用来挑选要打开的日志文件