Show HN: Nerdlog – 带有时间线直方图的快速多主机 TUI 日志查看器
Navigation Menu
dimonomid/nerdlog
master BranchesTags Go to file Code
Folders and files
Name| Name| Last commit message| Last commit date
---|---|---|---
Latest commit
History
314 Commits
blhistory| blhistory
clhistory| clhistory
cmd| cmd
core| core
images| images
log| log
shellescape| shellescape
util| util
.gitignore| .gitignore
LICENSE| LICENSE
Makefile| Makefile
README.md| README.md
benchmark| benchmark
go.mod| go.mod
go.sum| go.sum
View all files
Repository files navigation
Nerdlog
Nerdlog 是一个快速的、远程优先的、多主机的 TUI 日志查看器,具有时间线直方图,且无需中央服务器。它在设计上受到了 Graylog/Kibana 的启发,但避免了它们的臃肿。基本上不需要任何设置。
它专注于高效地从多个远程机器同时查询日志,按时间范围和模式进行过滤,并绘制时间线直方图,以便快速进行可视化分析:
主要用例:从一个或多个远程主机读取系统日志(
/var/log/messages
或 /var/log/syslog
)。即使对于大型日志文件(例如 1GB 或更大),也非常高效。
它确实支持其他一些日志格式,并且可以使用任何日志文件,但驱动实现的主要用例是:我们的 Web 服务后端作为 systemd 服务在一堆 Linux 实例上运行,打印大量日志,我们希望能够有效地读取这些日志,并拥有像 Graylog 这样的工具的时间线直方图。
设计亮点
- 不需要集中式服务器;nerdlog 建立与用户想要收集日志的每个节点的 SSH 连接,并使它们在后台保持空闲状态(尽管单独的服务器来存储日志文件可能仍然在某些情况下有所帮助;请参阅要求和限制文章中的章节);
- 日志不会完全下载到本地计算机:所有日志分析都在远程节点上完成,并且在每次查询时,仅从每个节点下载以下数据:每个 logstream 最多 250 条消息(可配置),以及用于时间线直方图的数据。显然可以对日志进行分页,以获取下一批消息等。然后,Nerdlog 将来自所有节点的响应合并在一起,并以统一的形式呈现给用户;
- 大多数数据在传输过程中都经过 gzip 压缩,从而节省了带宽。
演示
这是一个快速演示,展示了 Nerdlog 如何在四个远程节点上工作:
项目历史
了解项目的历史可能有助于理解项目动机和总体方向,您可以在完整文章中阅读。
项目状态
最初在 2022 年拼凑在一起,以取代速度慢得令人痛苦的 Splunk 设置。 在 2025 年重新审视,以在一定程度上清理它并开源。
但这仍然有点像概念验证阶段。 以最快的速度实施,意大利面条代码比比皆是,可以用更多的测试来覆盖,可以实施更多的功能等等。 仅在 Linux 上进行了真实测试,并且使用 Linux 主机来获取日志。
但是它有效。 它非常可用并且速度惊人。
安装
要构建它,您需要 Go。 安装后:
要将 nerdlog
二进制文件安装到您的 /usr/local/bin
中:
$ make && make install
或者构建并运行而不安装:
$ make && bin/nerdlog
使用
当您打开应用程序(nerdlog
二进制文件)时,它将显示一个带有几个字段的查询编辑表单:
时间范围是不言自明的。
下一个是 “Logstreams”:简而言之,logstream 指的是一个或多个_连续的_日志文件,例如 /var/log/syslog
,/var/log/syslog.1
等,位于可通过 SSH 访问的特定服务器上。 如果您有一个像 myserver.com
这样的服务器,可以通过端口 22 上的 SSH 访问,那么读取其 /var/log/syslog
(或 /var/log/messages
) 文件的 logstream 可以是:
myuser@myserver.com
如果您需要不同的端口和/或不同的日志文件,那么更明确的形式是:
myuser@myserver.com:1234:/some/other/logfile
多个 logstream 可以用逗号分隔提供,像这样:
myuser@myserver.com, myuser@myserver.com:1234:/some/other/logfile
Nerdlog 还会读取 SSH 配置 (~/.ssh/config
),并可以从中获取端口、用户名和主机名。 它也支持 globs,因此例如在您的 SSH 配置中,您有两个主机,例如 myhost-01
和 myhost-02
,那么与其将您的 logstream 指定为 myhost-01,myhost-02
,不如简单地指定为 myhost-*
。
显然,我们无法在 SSH 配置中指定日志文件,因此如果您需要为某些主机上的非默认日志文件配置 logstream,则可以使用 Nerdlog 自己的 logstream 配置文件 ~/.config/nerdlog/logstreams.yaml
,该文件可能如下所示:
log_streams:
myhost-01:
hostname: actualhost1.com
port: 1234
user: myuser
log_files:
- /some/custom/logfile
myhost-02:
hostname: actualhost2.com
port: 7890
user: myuser
log_files:
- /some/custom/logfile
该查询表单上的最后一件事是 “Select field expression”,它看起来像这样:
time STICKY, lstream, message, *
它仅影响日志在 UI 中的显示方式。 该语法有些类似于 SQL SELECT
语法,尽管限制更多。
此处的 STICKY
只是意味着当表向右滚动时,这些粘滞列将保持在左侧可见。
此处支持的另一个关键字是 AS
,因此例如 message AS msg
是有效的语法。
有关 logstream 和其他核心概念的更广泛的讨论,请考虑阅读文章中的核心概念部分。
要求
- 需要对远程主机的 SSH 访问。 您可以在此处阅读有关相关限制和可能的解决方法的信息:需要 SSH 访问的后果;
- SSH 代理必须在本地运行;
- Gawk (GNU awk) 是主机上的一个要求,因为 nerlog 依赖于
-b
选项。 因此,值得注意的是,mawk
将不起作用。 您需要gawk
; - 如果要读取系统日志(可通过
journalctl
访问的日志),请确保已安装rsyslog
或类似的系统; 否则,没有人会写入这些日志文件。 值得注意的是,在最新的 Fedora 和 Debian 上,默认情况下未安装rsyslog
。
有关这些要求、随之而来的限制以及解决这些问题的可能方法的更广泛的讨论,请参阅文章中的“要求和限制”部分。
UI
- Awk pattern input: 只是一个日志过滤器。 空过滤器显然意味着没有过滤器,一些有效过滤器的示例是:
- 简单正则表达式:
/foo bar/
- 具有复杂条件的正则表达式:
( /foo bar/ || /other stuff/ ) && !/baz/
- 简单正则表达式:
- Edit button: 打开上面讨论的完整查询编辑表单。
- Menu button: 只是打开一个包含一些额外项目的菜单:
- Back: 转到上一个查询,就像在浏览器中一样
- Forward: 转到下一个查询,就像在浏览器中一样
- Copy query command: 相当于在浏览器中复制 URL,其中包含指向当前日志查询的链接。 有关更多详细信息,请参见下面的
:xc[lip]
命令。
- Time range histogram: 与一些基于 Web 的日志查看器(如 Graylog 或 Kibana)类似,Nerdlog 还显示时间线直方图,因此您可以根据当前查询快速浏览日志的强度。 还可以轻松地以可视方式选择和应用时间范围(使用箭头/PgUp/PgDown/Home/End/Enter 键或类似 Vim 的绑定)
- Logs table: 显然包含实际日志。 就像在普通的旧式日志中一样,最新的消息在底部。 我不知道为什么现代 Web 工具会以相反的方式进行操作(最新的消息在顶部),对我来说这是胡说八道。 但是,如果您更喜欢这种现代方式,请告诉我; 使其可配置应该不会太难。 每行显示时间戳和消息,并且还可以向右滚动以显示从日志行解析的上下文标签。
- Status line。 在左侧,有几个带有数字的计算机图标:
- Green: 我们已完全连接且处于空闲状态的 lstream 的数量
- Orange: 我们已完全连接且正在执行查询的 lstream 的数量
- Red: 我们正在尝试连接的 lstream 的数量
在右侧,有 3 个数字,例如
1201 / 1455 / 2948122
。 最右边的数字 (2948122) 是与查询和时间范围匹配(并包含在上面的时间线直方图中)的日志消息的总数。 下一个数字 (1455) 是当前加载到 Nerdlog 应用程序中的实际日志行的数量,最左边的数字 (1201) 只是这些可用日志中的游标。
- Command line: 类似 Vim 的命令行。 点击
:
进入命令模式。
导航
最传统的方法是只使用 Tab 和 Shift+Tab 在小部件(日志表、查询输入、编辑和菜单按钮、时间线直方图)之间切换,使用箭头和 Home/End/PgUp/PgDn 等键在小部件内移动,使用 Enter 应用事物,使用 Escape 取消事物。
如果您了解 Vim,那么您也会在 Nerdlog 中感到宾至如归,因为它支持一堆类似 Vim 的按键绑定:
- 只要您不在某些文本编辑字段(如查询输入等)中,
h
、j
、k
、l
、g
、G
、Ctrl+U
、Ctrl+D
等键就会移动光标 - 点击 Escape 最终会将您带到 “Normal mode”,这意味着日志表已聚焦(并且所有这些
h
、j
、k
、l
等都在那里起作用) :
聚焦命令行,您可以在其中输入一些命令(见下文)i
或a
聚焦主查询输入字段
在输入字段(命令行、查询输入等)中时,您可以使用 Up
/Down
或 Ctrl+P
/Ctrl+N
浏览输入历史记录。
在查询编辑表单中(UI 上的 Edit 按钮,或 :e[dit]
命令),Ctrl+K
/Ctrl+J
迭代 “full” 查询历史记录(不仅影响一个字段(如查询),而且影响所有字段:时间范围、logstream 过滤器、查询)。
命令
除了可以自我发现的 UI 之外,还有一个类似 Vim 的命令行,支持几个命令。
:xc[lip]
将命令字符串复制到剪贴板,该字符串将使用当前的 logstream 过滤器、时间范围和查询打开 Nerdlog。 这也可以从菜单完成(菜单 -> 复制查询命令)
这相当于用于基于 Web 的日志记录工具的 URL 共享:当您通常复制 Graylog URL 并将其粘贴到 Slack 中的某个位置时,使用 Nerdlog,您可以通过共享此字符串来执行相同的操作。
该字符串将如下所示:
nerdlog --lstreams 'localhost' --time -3h --pattern '/something/'
它可以在 shell 中使用(这将打开 Nerdlog 的新实例),或者也可以在当前正在运行的 Nerdlog 实例中使用:只需键入 :
进入命令模式,复制粘贴上面的命令,Nerdlog 将对其进行解析并应用查询。
:back
或 :prev
转到上一个查询,就像在浏览器中一样。 这也可以从菜单完成(菜单 -> 返回)
:fwd
或 :next
转到下一个查询,就像在浏览器中一样。 这也可以从菜单完成(菜单 -> 前进)
:e[dit]
打开查询编辑表单; 如果您只是使用 Tab 导航到 UI 中的 “Edit” 按钮,则可以执行相同的操作。
:w[rite] [filename]
将所有当前加载的日志行写入文件名。 如果省略文件名,则使用 /tmp/last_nerdlog
。
:reconnect
重新连接到所有 logstream
:disconnect
与所有 logstream 断开连接
:set option=value
将选项设置为新值
:set option?
获取选项的当前值
当前支持的选项是:
numlines
:每次请求从每个 logstream 加载的日志消息的数量。 默认值:250。timezone
:用于在 UI 上格式化时间戳的时区。 默认情况下,使用Local
,但您可以指定UTC
或America/New_York
等。
:q[uit]
退出应用程序。
更多详情
查看 Nerdlog 文章,以更深入地了解核心概念、限制和解决方法以及实施细节。
关于
Nerdlog: fast, remote-first, multi-host TUI log viewer with timeline histogram and no central server
Resources
License
Stars
Watchers
Forks
Releases
No releases published
Packages 0
No packages published
Languages
Footer
Footer navigation
You can’t perform that action at this time.