用 Loki 和 fzf 進階你的 Shell 歷史記錄
Loki 是一個 Apache 2.0 許可的開源日誌聚合框架,由 Grafana 實驗室設計,並在不斷發展的社區的巨大支持之下建立。它也是我每天為之努力的項目。在這篇文章中,我將不只是談論 Loki 如何工作,而是提供一個實際操作的介紹,以解決實際問題。
問題:一個持久的集中式 Shell 歷史記錄
我喜歡我的 shell 歷史,一直是 CTRL+R
的狂熱用戶。大約一年前,我的終端生活發生了翻天覆地的變化,我的同行 Dieter Plaetinck 向我介紹了命令行模糊查找器 fzf。
突然間,在命令中搜索就從這樣:
![在 Loki 和 fzf 之前](/data/attachment/album/202101/06/155024uqt9jvzqh5c5ptjh.gif "Before Loki and fzf")
變成了這樣:
![在 Loki 和 fzf 之後](/data/attachment/album/202101/06/155025n7u14eemmqh2mdyy.gif "After Loki and fzf")
雖然 fzf
極大地提高了我的生活質量,但圍繞著我的 shell 歷史記錄,還是缺少了一些片段:
- 終端突然關閉、電腦崩潰、死機、整盤加密密鑰被遺忘等情況下會丟失 shell 歷史記錄。
- 想從我的所有電腦上訪問我的 shell 歷史記錄。
我認為我的 shell 歷史記錄是文件:它是一個重要的故事,我不想失去。將 Loki 與我的 shell 歷史結合起來,有助於解決這些問題和更多問題。
關於 Loki
Loki 採用了開源 Prometheus 項目用於度量的直觀的標籤模型,並將其擴展到日誌聚合的世界。這使得開發人員和運維人員能夠使用相同的標籤集在他們的度量和日誌之間無縫切換。即使你沒有使用 Prometheus,也有很多理由說明 Loki 可能很適合你的日誌存儲需求:
- 低開銷: Loki 不做全文日誌索引;它只創建你放在日誌上的標籤的索引。保持小的索引大大降低了 Loki 的運維要求。我在 樹莓派 上運行我的 loki-shell 項目,該項目使用 Loki 來存儲 shell 歷史記錄,只使用了 50MB 多一點的內存。
- *成本低:**日誌內容被壓縮並存儲在對象存儲中,如 Amazon S3、Google 雲存儲、Azure Blob,甚至可以直接存儲在文件系統中。我們的目標是使用價格低廉且持久的存儲。
- 靈活性: Loki 以單個二進位文件的形式提供,可以直接下載並運行,也可以作為 Docker 鏡像在任何容器環境中運行。在 Kubernetes 中可以用一個 Helm 海圖 快速上手。如果你對日誌工具的要求很高,可以看看運行在 Grafana 實驗室的 生產環境。它使用開源的 Jsonnet 和 Tanka 部署了同樣的 Loki 鏡像作為離散的構件,以實現大規模的水平擴展、高可用性、複製、讀寫路徑的分別擴展、高度可並行的查詢等。
總而言之,Loki 的方法是保留一個關於你的日誌元數據的小索引(標籤),並將未索引的、壓縮的日誌內容存儲在廉價的對象存儲中,以使操作更容易和更便宜。該應用程序被構建為單進程運行,並很容易演變成一個高可用的分散式系統。你可以通過並行化和查詢的分片,在較大的日誌工作負載上獲得較高的查詢性能 —— 有點像為你的日誌設計的 MapReduce。
此外,這個功能是任何人都可以免費使用的。與其 Grafana 開放觀測性平台一樣,Grafana 實驗室致力於將 Loki 打造成一個任何人都可以使用的全功能、全開放的日誌聚合軟體。
開始吧
我在樹莓派上運行 Loki,並將我的 shell 歷史記錄異地存儲在 S3 bucket 中。
當我按下 CTRL+R
,Loki 的 LogCLI 命令行界面會發起幾個批處理請求,傳輸至 fzf
。下面是一個例子,上半部分顯示的是樹莓派上的 Loki 伺服器日誌。
![樹莓派上 Loki 伺服器的日誌](/data/attachment/album/202101/06/155026bxl1ahdhwwgzr52h.gif "Logs of the Loki server on Raspberry Pi")
準備試試?下面的指南將幫助你設置和運行 Loki,與你的 shell 歷史記錄集成。為了讓本教程保持簡潔,此設置將 Loki 本地運行在你的計算機上,並在文件系統上存儲所有文件。
在 loki-shell 的 GitHub 版本庫,你可以找到所有這一切,以及如何設置一個更複雜的安裝的信息。
請注意,本教程不會改變任何圍繞你的歷史記錄的現有行為,所以 你現有的 shell 歷史記錄命令和歷史記錄設置不會被觸動。相反,這將用 Bash 中的 $PROMPT_COMMAND
和 Zsh 中的 precmd
複製命令歷史記錄到 Loki。在 CTRL+R
方面,它重載了 fzf
用來訪問 CTRL+R
命令的函數。因此試一試是安全的,如果你覺得不喜歡它,只需按照 GitHub 版本庫中的 卸載步驟 來刪除所有痕迹。你的 shell 歷史記錄不會被觸及。
第一步:安裝 fzf
安裝 fzf
有幾種方法,但我更喜歡 Git 方法:
git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf
~/.fzf/install
對所有的問題提示說 yes
。
如果你已經安裝了 fzf
,確保你已經啟用了鍵綁定(即,確保當你輸入 CTRL+R
時,fzf
會彈出)。如果有必要的話,你可以重新運行 fzf
安裝過程來啟用鍵綁定。
第二步:安裝 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
或按回車鍵。
在本地運行 Loki 有兩種方式:作為一個 Docker 鏡像或作為一個單一的二進位文件(支持添加為 systemd 服務)。如果可以,我建議使用 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。然而,這個演示只是使用了默認的 URL,所以你可以按回車鍵。
它會輸出很多文本來解釋添加到你的 ~.bashrc
或 ~.zshrc
(或兩者)的所有條目。
好了!
Finished. Restart your shell or reload config file.
source ~/.bashrc # bash
source ~/.zshrc # zsh
第三步:試試吧!
開始使用你的 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
的別名)。
![計數一個命令的使用次數](/data/attachment/album/202101/06/155026yuuvrrqf8lluqdrt.png "Counting use of a command")
額外增強
安裝 Grafana,擺弄一下你的 shell 歷史記錄。
docker run -d -p 3000:3000 --name=grafana grafana/grafana
打開 Web 瀏覽器,訪問 http://localhost:3000
,使用默認的 admin
/admin
用戶名和密碼登錄。
在左邊,導航到「 配置 -> 數據源 」,點擊「 添加數據源 」按鈕,然後選擇 「Loki」。
對於 URL,你應該可以使用 http://localhost:4100
(然而,在我的 WSL2 機器上,我必須使用計算機的實際 IP 地址)。
單擊「 保存並測試 」。你應該看到連接了數據源並找到了標籤。
點擊左邊的「 管理器 」圖標,確保選擇 Loki 數據源,並嘗試這個查詢:
{job="shell"}
如果發送 shell 命令的主機較多,可以使用「 主機 」標籤將結果限制在某個主機上:
{job="shell", hostname="myhost"}.
你也可以用過濾表達式尋找特定的命令:
{job="shell"} |= "docker"
或者你可以從日誌中探索度量的世界,看看你使用 shell 的頻率:
rate({job="shell"}[1m])
![計算過去 20 天內 shell 的使用情況](/data/attachment/album/202101/06/155026dsbhmwqzww03wx2w.png "Counting use of the shell over previous 20 days")
想從一個事件中重建一個時間線?你可以通過特定的命令進行過濾,查看它的運行時間:
![計算命令的使用次數](/data/attachment/album/202101/06/155027ezp8puf6c0ojcfjz.png "Counting use of a command")
要想知道你還能做什麼,並了解更多關於 Loki 查詢語言的信息,請查看 LogQL 指南。
總結
更多的想法、故障排除和更新,請關注該 GitHub 版本庫。這仍然是一項正在進行中的工作,所以請在那裡報告發現的任何問題。
要了解更多關於 Loki 的信息,請查看文檔、博客文章和該 GitHub 版本庫,或者在 Grafana Cloud 中試用。
特別感謝我的同事 Jack Baldry 為這個想法播下的種子。我有 Loki 的知識來實現這個想法,但如果不是他的建議,我想我永遠也不會做到這一點。
via: https://opensource.com/article/20/10/shell-history-loki-fzf
作者:Ed Welch 選題:lujun9972 譯者:wxy 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive