Loki扩展了用于指标监控和日志聚合的Prometheus模型。Loki是一个Apache2.0许可的开源日志聚合框架,由GrafanaLabs设计,并在不断发展的社区的大力支持下构建。这也是我每天都在做的一个项目。在这篇文章中,我不仅会谈论Loki的工作原理,还会提供解决实际问题的实践介绍。问题:持久的集中式Shell历史我喜欢我的Shell历史,并且一直是CTRL+R的狂热用户。大约一年前,当我的同事DieterPlaetinck向我介绍命令行模糊查找器fzf时,我的终端生活发生了翻天覆地的变化。突然,在命令中搜索从这个:在Loki和fzf之前到这个:在Loki和fzf之后虽然fzf大大提高了我的生活质量,但围绕我的shell历史,缺少了一些东西片段:终端突然关闭时Shell历史丢失、计算机崩溃、死机、磁盘加密密钥被遗忘等。想要从我所有的计算机访问我的shell历史记录。我将我的shell历史视为一个文件:这是一个我不想丢失的重要故事。将Loki与我的shell历史相结合有助于解决这些问题以及更多问题。关于LokiLoki采用开源Prometheus项目用于度量的直观标签模型,并将其扩展到日志聚合领域。这使开发人员和运维人员能够使用同一组标签在其指标和日志之间无缝切换。即使您不使用Prometheus,Loki也可能非常适合您的日志存储需求的原因有很多:低开销:Loki不索引全文日志;它只会创建您放在日志上的标签的索引。保持索引较小可以大大降低Loki的操作要求。我在RaspberryPi上运行我的loki-shell项目,它使用Loki来存储shell历史记录,并使用超过50MB的内存。*低成本:**日志内容被压缩并存储在对象存储中,例如AmazonS3、GoogleCloudStorage、AzureBlob,甚至直接存储在文件系统中。我们的目标是使用廉价且耐用的存储。灵活性:Loki作为可以直接下载和运行的单个二进制文件提供,或者作为任何容器环境中的Docker映像提供。使用Kubernetes中的Helm图表快速入门。如果你对日志工具要求比较高,可以看看GrafanaLabs中运行的生产环境。它使用开源的Jsonnet和Tanka,将同一个Loki镜像部署为离散组件,实现大规模水平扩展、高可用、复制、读写路径分离扩展、高并行查询等。总结一下,Loki的做法是:保留有关日志的元数据的小索引(标签),并将未索引的压缩日志内容存储在便宜的对象存储中,以使操作更容易和更便宜。该应用程序构建为作为单个进程运行,并可轻松演变为高度可用的分布式系统。您可以通过查询的并行化和分片在更大的日志工作负载上实现高查询性能——有点像日志的MapReduce。此外,任何人都可以免费使用此功能。与旗下的Grafana开放可观察平台一样,GrafanaLabs致力于将Loki打造成一个功能齐全、完全开放的日志聚合软件,任何人都可以使用。我在RaspberryPi上运行Loki,并将我的shell历史记录异地存储在S3存储桶中。当我按下CTRL+R时,Loki的LogCLI命令行界面将发起多个批处理请求并将它们传输给fzf。下面是一个示例,上半部分显示了RaspberryPi上的Loki服务器日志。Loki服务器登录RaspberryPi准备好尝试了吗?下面的指南将帮助您启动和运行Loki,并与您的shell历史记录集成。为了使本教程简单,此设置将使Loki在您的计算机上本地运行并将所有文件存储在文件系统上。您可以在loki-shellGitHub存储库中找到所有这些以及有关如何设置更复杂安装的信息。请注意,本教程不会更改您的历史记录的任何现有行为,因此不会触及您现有的shell历史记录命令和历史记录设置。相反,这将使用Bash中的$PROMPT_COMMAND和Zsh中的precmd将命令历史记录复制到Loki。在CTRL+R端,它重载了fzf用来访问CTRL+R命令的函数。所以试一试是安全的,如果您不喜欢它,只需按照GitHub存储库中的卸载步骤删除所有痕迹即可。你的shell历史不会被触及。第一步:安装fzf安装fzf有几种方式,但我更喜欢Git方式:gitclone--depth1https://github.com/junegunn/fzf.git~/.fzf~/.fzf/install说对所有问题都是肯定的。如果您安装了fzf,请确保您已启用键绑定(即确保在您键入CTRL+R时弹出fzf)。如有必要,您可以重新运行fzf安装过程以启用键绑定。第二步:安装loki-shell和fzf一样,loki-shell也有一个Git仓库和安装脚本:gitclone--depth1https://github.com/slim-bean/loki-shell.git~/。loki-shell~/.loki-shell/install首先,脚本创建~/.loki-shell目录,所有文件都将保存在此目录中(包括Loki数据),接下来,它将下载Promtail、LogCLI和Loki二进制文件.然后它会问:你想安装Loki吗?([y]/n)如果你已经在为Loki-shell运行集中式Loki,你可以回答n;但是,对于本教程,请回答y或按返回车键。有两种方法可以在本地运行Loki:作为Docker镜像或作为单个二进制文件(支持添加为systemd服务)。如果可以,我建议使用Docker,因为我认为它可以简化一些事情,但两者都可以。将Loki作为Docker镜像运行:[y]在Docker中运行Loki,[n]将Loki作为二进制运行([y]/n)yError:Nosuchobject:loki-shellErrorresponsefromdaemon:Nosuchcontainer:loki-shellError:Nosuchcontainer:loki-shell54843ff3392f198f5cac51a6a5071036f67842bbc23452de8c3efa392c0c2e1e如果这是您第一次运行此安装程序,您可以忽略该错误消息。此脚本将停止并替换正在运行的Loki容器,如果版本不匹配,您可以重新运行此脚本来升级Loki。就是这样!Loki现在作为Docker容器运行。Loki的数据将存储在~/.loki-shell/data中。由于图像是使用-restart=unless-stopped标志运行的,它将在系统重启时重新启动服务,但如果您运行dockerstoploki-shell它将保持停止状态。(如果您使用的是Docker,则可以跳到“Shell集成”部分。)作为二进制文件运行有多种方法可以在Linux系统上运行二进制文件。此脚本安装systemd服务。如果您没有systemd,您也可以使用二进制安装:[y]在Docker中运行Loki,[n]以二进制形式运行Loki([y]/n)n使用systemd运行Loki?([y]/n)n这是此脚本所能达到的极限您需要为Loki设置自动启动它可以使用此命令运行:/home/username/.loki-shell/bin/loki-config。文件=/家/用户名/。loki-shell/config/loki-binary-config.yaml脚本将输出运行Loki所需的命令,您可以设置一个init脚本或其他方法来自动启动它。如果需要,您可以直接运行此命令以从当前shell运行Loki。如果您有systemd,您可以选择让脚本安装systemd服务或向您展示自己运行它的命令:使用systemd运行Loki?([y]/n)y安装systemd服务需要root权限。[y]运行这些命令用sudo[n]打印出命令,你可以自己运行。([y]/n)nsudocp/home/ed/.loki-shell/config/loki-shell.service/etc/systemd/system/loki-shell.servicesudosystemctldaemon-reloadsudosystemctlenableloki-shellsudosystemctlstartloki-shell复制这些命令并在脚本完成时运行它们。(按Enter键继续)Shell集成无论您如何安装Loki,您现在都应该看到提示:输入Loki服务器的URL或按Enter键默认为(http://localhost:4100)如果您设置了集中式Loki,你应该在这里输入它的URL。但是,此演示仅使用默认URL,因此您可以按回车键。它将输出大量文本,解释添加到~.bashrc或~.zshrc(或两者)的所有条目。好吧!完成的。重新启动shell或重新加载配置文件。source~/.bashrc#bashsource~/.zshrc#zsh第3步:尝试一下!开始使用您的shell并使用CTRL+R查看您的命令。打开多个终端窗口,在一个窗口中键入命令,然后在另一个窗口中键入CTRL+R,您会立即看到您的命令可用。另请注意,当您在终端之间切换并输入命令时,使用CTRL+R可使它们立即可用,但向上箭头的操作在终端之间不受影响。(如果您安装了OhMyZsh,情况可能并非如此,因为它会自动将所有命令附加到历史记录中。)多次按CTRL+R可在按时间排序和按相关性排序之间切换。请注意,即使您从多个主机向Loki发送shell数据,此配置也只会显示当前主机的查询历史记录。我认为这是默认的最合理的。如果你想改变这种行为,有很多调整;有关更多信息,请参阅loki-shell存储库。它还会安装一个名为hist的别名。aliashist="$HOME/.loki-shell/bin/logcli--addr=$LOKI_URL"LogCLI可用于直接在Loki上查询和搜索您的历史记录,还允许您搜索其他主机。查看LogCLI入门指南以了解有关查询的更多信息。Loki的日志查询语言(LogQL)提供了度量查询,可以让你做一些有趣的事情,例如,我可以看到我在过去30天内发出了多少次kc命令(我对kubectl的别名)。计算命令被使用的次数其他增强功能安装Grafana并摆弄您的shell历史记录。dockerrun-d-p3000:3000--name=grafanagrafana/grafana打开浏览器,访问http://localhost:3000,使用默认的admin/admin用户名和密码登录。在左侧,导航到“Configuration->Datasources”,单击“AddDatasource”按钮,然后选择“Loki”。对于URL,您应该可以使用http://localhost:4100(但是,在我的WSL2机器上,我必须使用计算机的实际IP地址)。单击保存并测试。您应该看到连接的数据源和找到的标签。单击左侧的“ManagerExplore”图标,确保选择了Loki数据源,然后尝试查询:{job="shell"}如果有很多主机发送shell命令,您可以使用“主机”选项卡将结果限制在某个主机上:{job="shell",hostname="myhost"}。您还可以使用过滤器表达式来查找特定命令:{job="shell"}|="docker"或者您可以从logsWorld中探索指标,看看您使用shell的频率:rate({job="shell"}[1m])计算过去20天的shell使用情况想根据事件重建时间线?您可以按特定命令进行过滤并查看花费了多长时间:计算命令被使用的次数要了解您还可以做什么,并了解有关Loki查询语言的更多信息,请查看LogQL指南。如需更多想法、故障排除和更新,请关注此GitHub存储库。这项工作仍在进行中,因此请报告您在那里发现的任何问题。要了解有关Loki的更多信息,请查看文档、博客文章和此GitHub存储库,或在GrafanaCloud中试用。
