使用 Loki 和 fzf 提升你的 shell 历史记录

Loki 扩展了 Prometheus 用于监控指标和日志聚合的模型。
86 位读者喜欢这个。
Gears above purple clouds

Loki 是一个 Apache 2.0 许可的开源日志聚合框架,由 Grafana Labs 设计,并在不断壮大的社区的大力支持下构建而成。它也是我每天工作的项目。在本文中,我将不再仅仅讨论 Loki 的工作原理,而是提供一个关于如何使用 Loki 解决实际问题的实践入门。

问题:持久化的集中式 shell 历史记录

我热爱我的 shell 历史记录,并且一直是 CTRL+R 的狂热用户。大约一年前,当我的同事 Dieter Plaetinck 向我介绍了命令行模糊查找器 fzf 时,我的终端生活发生了翻天覆地的变化。

突然之间,搜索命令从这样变成了这样

变成这样

虽然 fzf 显著提高了我的生活质量,但我的 shell 历史记录仍然缺少一些部分

  • 当终端突然关闭、计算机崩溃、计算机报废、整个磁盘加密密钥被遗忘时,shell 历史记录会丢失
  • 能够我的所有计算机我的所有计算机上访问我的 shell 历史记录

我认为我的 shell 历史记录就像文档:它是一个重要的故事,我不想丢失。将 Loki 与我的 shell 历史记录结合使用有助于解决这些问题以及更多问题。

关于 Loki

Loki 采用了开源 Prometheus 项目用于指标的直观标签模型,并将其扩展到日志聚合领域。这使开发人员和运维人员可以使用同一组标签在指标和日志之间无缝切换。即使您没有使用 Prometheus,Loki 仍然有很多理由成为您日志存储需求的理想选择

  • 低开销:Loki 不进行全文日志索引;它只创建您添加到日志中的标签索引。保持小索引大大降低了 Loki 的运行要求。我正在 Raspberry Pi 上运行我的 loki-shell 项目(该项目使用 Loki 存储 shell 历史记录),仅使用了 50MB 多一点的内存。
  • 低成本:日志内容被压缩并存储在对象存储中,例如 Amazon S3、Google Cloud Storage、Azure Blob,甚至直接存储在文件系统中。目标是使用廉价且持久的存储。
  • 灵活性:Loki 以单个二进制文件的形式提供,可以下载并直接运行,也可以作为 Docker 镜像在任何容器环境中运行。Helm chart 可用于在 Kubernetes 中快速入门。如果您对日志记录工具有很高的要求,请查看 Grafana Labs 运行的 生产环境设置。它使用开源 JsonnetTanka 将相同的 Loki 镜像部署为离散的构建块,以实现大规模横向扩展、高可用性、复制、读取和写入路径的单独扩展、高度可并行化的查询等等。

总而言之,Loki 的方法是保留关于日志元数据(标签)的小索引,并将未索引和压缩的日志内容存储在廉价的对象存储中,以使操作更简单、更便宜。该应用程序旨在作为单个进程运行,并轻松演变为高可用的分布式系统。您可以通过查询的并行化和分片(有点像日志的 MapReduce)在更大的日志记录工作负载上获得高性能查询。

此外,任何人都可以免费使用此功能。与它的 Grafana 开源可观测性平台一样,Grafana Labs 致力于使 Loki 成为任何人都可以使用的功能齐全、完全开源的日志聚合软件。

开始使用

我正在我的家庭网络中的 Raspberry Pi 上运行 Loki,并将我的 shell 历史记录异地存储在 S3 存储桶中。

当我按下 CTRL+R 时,Loki 的 LogCLI 命令行界面会发出多个批处理请求,这些请求被流式传输到 fzf 中。这是一个示例——顶部显示了 Pi 上的 Loki 服务器日志。

准备好试一试了吗?以下指南将帮助您设置和运行 Loki,以便与您的 shell 历史记录集成。由于本教程旨在保持简单,因此此设置将在您的计算机本地运行 Loki,并将所有文件存储在文件系统中。

您可以在 loki-shell GitHub 仓库中找到所有这些内容,以及有关如何设置更精细安装的信息。

请注意,本教程不会更改有关您的历史记录的任何现有行为,因此您现有的 shell 历史记录命令和历史记录设置将保持不变。相反,这会将命令历史记录复制到 Loki,Bash 中使用 $PROMPT_COMMAND,Zsh 中使用 precmd。在 CTRL+R 方面,它重载了 fzf 用于访问 CTRL+R 命令的函数。尝试这样做是安全的,如果您决定不喜欢它,只需按照 GitHub 仓库中的 卸载步骤 删除所有痕迹即可。您的 shell 历史记录将保持不变。

步骤 1:安装 fzf

有几种安装 fzf 的方法,但我更喜欢 Git 方法

git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf
~/.fzf/install

对所有问题提示回答“是”。

如果您已经安装了 fzf,请确保启用了键绑定(即,确保当您键入 CTRL+R 时,fzf 会弹出)。如有必要,您可以重新运行 fzf 安装以启用键绑定。

步骤 2:安装 loki-shell

与 fzf 一样,loki-shell 也有一个 Git 仓库和安装脚本

git clone --depth 1 https://github.com/slim-bean/loki-shell.git ~/.loki-shell
~/.loki-shell/install

首先,该脚本创建 ~/.loki-shell 目录,所有文件(包括 Loki 数据)都将保存在其中。接下来,它将下载 Promtail、LogCLI 和 Loki 的二进制文件。

然后它会询问

Do you want to install Loki? ([y]/n)

如果您已经有一个为 loki-shell 运行的集中式 Loki,您可以回答 n;但是,对于本教程,请回答 y 或按 Enter 键。

有两种选项可用于在本地运行 Loki:作为 Docker 镜像或作为单个二进制文件(支持添加 systemd 服务)。如果 Docker 可用,我建议使用 Docker,因为我认为它简化了一些操作,但两者都运行良好。

使用 Docker 运行

要将 Loki 作为 Docker 镜像运行

[y] to run Loki in Docker, [n] to run Loki as a binary ([y]/n) y
Error: No such object: loki-shell
Error response from daemon: No such container: loki-shell
Error: No such container: loki-shell
54843ff3392f198f5cac51a6a5071036f67842bbc23452de8c3efa392c0c2e1e

如果这是您第一次运行安装,您可以忽略错误消息。如果版本不匹配,此脚本将停止并替换正在运行的 Loki 容器,这允许您重新运行此脚本以升级 Loki。

就这样!Loki 现在作为 Docker 容器运行。

来自 Loki 的数据将存储在 ~/.loki-shell/data 中。

该镜像以 --restart=unless-stopped 运行,因此它将在重新启动时重新启动,但如果您运行 docker stop loki-shell,它将保持停止状态。

(如果您使用 Docker,您可以跳到 Shell 集成。)

作为二进制文件运行

在 Linux 系统上运行二进制文件有很多种方法。此脚本可以安装 systemd 服务。如果您没有 systemd,您仍然可以使用二进制文件安装

[y] to run Loki in Docker, [n] to run Loki as a binary ([y]/n) n

Run Loki with systemd? ([y]/n) n

This is as far as this script can take you
You will need to setup an auto-start for Loki
It can be run with this command: /home/username/.loki-shell/bin/loki -config.file=/home/username/.loki-shell/config/loki-binary-config.yaml

该脚本将输出您需要用于运行 Loki 的命令,您将需要自己设置 init 脚本或另一种自动启动方法。

如果您愿意,您可以直接运行该命令,并从当前 shell 运行 Loki。

如果您 systemd,您可以选择让脚本安装 systemd 服务,或向您显示自己运行它的命令

Run Loki with systemd? ([y]/n) y

Installing the systemd service requires root permissions.
[y] to run these commands with sudo [n] to print out the commands and you can run them yourself. ([y]/n) n
sudo cp /home/ed/.loki-shell/config/loki-shell.service /etc/systemd/system/loki-shell.service
sudo systemctl daemon-reload
sudo systemctl enable loki-shell
sudo systemctl start loki-shell
Copy these commands and run them when the script finishes. (press enter to continue)

Shell 集成

无论您如何安装 Loki,您现在都应该看到一个提示

Enter the URL for your Loki server or press enter for default (http://localhost:4100)

如果您已设置集中式 Loki,您可以在此处输入该 URL。但是,此演示仅使用默认值,因此您可以按 Enter 键。

将会输出大量文本,解释添加到您的 ~.bashrc~.zshrc(或两者)中的所有条目。

就这样!

Finished. Restart your shell or reload config file.
   source ~/.bashrc  # bash
   source ~/.zshrc   # zsh

步骤 3:试用一下!

开始使用您的 shell,并使用 CTRL+R 查看您的命令。

打开多个终端窗口,在一个窗口中键入命令,在另一个窗口中按 CTRL+R,您将立即看到您的命令可用。

另请注意,当您在终端之间切换并输入命令时,它们会立即通过 CTRL+R 可用,但向上箭头的操作在终端之间不受影响。(如果您安装了 Oh My Zsh,情况可能并非如此,因为它会自动将所有命令附加到历史记录中。)

多次使用 CTRL+R 可在按时间和按相关性排序之间切换。

请注意,即使您从多台主机向 Loki 发送 shell 数据,此配置也只会显示当前主机的查询历史记录。我认为默认情况下这是最合理的。如果您希望更改此行为,可以进行很多调整;请参阅 loki-shell 仓库以了解更多信息。

它还安装了一个名为 hist 的别名

alias hist="$HOME/.loki-shell/bin/logcli --addr=$LOKI_URL"

LogCLI 可用于直接在 Loki 中查询和搜索您的历史记录,包括允许您搜索其他主机。查看 LogCLI 入门指南,以了解有关查询的更多信息。

Loki 的日志查询语言 (LogQL) 提供了指标查询,允许您执行一些有趣的操作;例如,我可以查看在过去 30 天内我发出 kc 命令(我的 kubectl 别名)的次数

额外加分

安装 Grafana 并试用您的 shell 历史记录

docker run -d -p 3000:3000 --name=grafana grafana/grafana

在 Web 浏览器中打开 http://localhost:3000,并使用默认的 admin/admin 用户名和密码登录。

在左侧,导航到 Configuration -> Datasources,单击 Add Datasource 按钮,然后选择 Loki

对于 URL,您应该可以使用 http://localhost:4100(但是,在我的 WSL2 机器上,我必须使用计算机的实际 IP 地址)。

单击 Save and Test。您应该看到 Data source connected and labels found

单击左侧的 Explore 图标,确保选择了 Loki 数据源,然后尝试查询

{job="shell"}

如果您有更多主机发送 shell 命令,您可以使用 hostname 标签将结果限制为特定主机

{job="shell", hostname="myhost"}.

您还可以使用过滤器表达式查找特定命令

{job="shell"} |= "docker"

或者您可以开始探索来自日志的指标世界,以了解您使用 shell 的频率

rate({job="shell"}[1m])

想要从事件中重建时间线?您可以按特定命令进行过滤,并查看其运行时间。

要查看您还可以做什么并了解有关 Loki 查询语言的更多信息,请查看 LogQL 指南

最后的想法

有关更多想法、故障排除和更新,请关注 GitHub 仓库。这仍然是一个正在进行中的工作,因此请在那里报告任何问题。

要了解有关 Loki 的更多信息,请查看 文档博客文章GitHub 仓库,或在 Grafana Cloud 中试用它。


特别感谢我的同事 Jack Baldry,是他为这个想法播下了种子。我拥有 Loki 知识来实现这一点,但如果不是他的建议,我想我永远不会走到这一步。

接下来阅读什么
标签
Avatar
Ed Welch 拥有丰富的软件开发经验,包括机器人控制系统、车辆车队跟踪和电信中间件。

1 条评论

嘿,谢谢你的精彩介绍!
“不幸的是”,我的 shell 是我最好的朋友,除了我人类最好的朋友,所以我需要知道什么可以改善我的 zshell。

我期待一个小巧的助手,当我看到第一个 fzf 功能,即可见的历史记录时,我印象深刻,并心想:正是我需要的!但是,有了 loki 和 promtail,我意识到你介绍了一些非常庞大且很酷的工具!
目前唯一的缺点是,我目前不知道如何将我当前的 shell 历史记录迁移到其中。目前,我为 fzf 的纯粹使用添加了另一个小部件和键绑定。

并且安装脚本还假定它已安装到 ~/.loki-shell 中,但我将其放在其他位置。因此,我需要调整 loki 脚本。对我来说不是问题,但对其他人来说可能是问题。

尽管如此,感谢您的工作和简单的介绍。我不确定今年剩下的时间除了玩弄所有新东西之外我还会做什么。 :-D

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 获得许可。
© . All rights reserved.