ログ収集に特化した Grafana Lokiを味わう。
ログ収集の方法はサーバーエンジニアが担う重要な部分ですので当ホームページではよく扱っておりますし、方法はいくつあっても良いものです。
便利で楽ならなお良しです。
そんな中で、キレイなダッシュボードを提供してくれる Grafanaが Lokiちゅ〜のを出しています。
Prometheusと Grafanaがサーバーメトリクス収集のセットなら、Lokiと Grafanaはログ収集のセットです。
Grafana Lokiのサイトはこちら。
Grafana Loki
ドキュメントが以下にあります。
Grafana Loki documentation
このドキュメントの冒頭に Lokiの特徴がありまして、いくつかピックアップしますと
- エージェント(監視対象)からプッシュ型で Lokiにログデータを送るタイプ
- ログデータを直接データベースには入れず、オブジェクトストレージ(ローカルストレージもOK)など外部ストレージに配置するおかげで拡張が容易
とのことです。
構成は図にするとこんな感じになるようで、Windowsのイベントログも集められるって話なので、それにチャレンジしてみます。
(公式ドキュメントにはもうちょっと詳しい図があります)
そんなに複雑なものではないと思いますので、早速環境を作ってみたいと思います。
1.環境
以下のセットでやります。
監視されるサーバー | Windows Server 2022 |
Grafana Lokiのサーバー | Ubuntu Server 24.04 |
Grafanaのサーバー | Ubuntu Server 24.04 |
クライアント | Lubuntu 24.04の Firefox (何でも良い) |
前提となる Windows Server 2022と Ubuntu Server 2404のインストールについては、
「Windows Server 2022 インストール」と、
「Ubuntu 24.04 Server インストール」に書いています。
0.Grafana Lokiインストール(失敗編)
「ど〜でも良いから早く入れさせろ」という方は「2.Grafana Lokiインストール(成功編)」に飛びましょう。
中心になる Grafana Lokiのサーバーを作ります。
Ubuntu Serverはマシン名を [GrafanaLoki]、IPアドレスを [192.168.1.115] で作ってあります。
ドキュメントの(コンテナなどと並んで)ローカルインストールの箇所はこちら。
Local
これに従ってインストールしていきます。
Ubuntuではデフォルトのパッケージリポジトリからインストールするように書いてありました。
2024年5月18日時点の最新バージョンは 3.0.0です。
一応 aptと snapの両方のパッケージを調べてみます。
aptのほう。
subro@GrafanaLoki:~$ apt search loki
〜〜〜 省略 〜〜〜
loki/noble 2.4.7.4-10 amd64
一般的な家系の MCMC 連鎖分析
〜〜〜 省略 〜〜〜
ありました。
やや古いか?と思う 2.4.7.4-10でした。
snapのほう。
subro@GrafanaLoki:~$ snap info loki
name: loki
summary: Log aggregation system inspired by Prometheus [ABANDONED]
publisher: Sergio Durigan Junior (sergiodj)
store-url: https://snapcraft.io/loki
license: Apache-2.0
description: |
**THIS SNAP IS NOT BEING MAINTAINED ANYMORE**
Loki is a horizontally-scalable, highly-available, multi-tenant log
aggregation system inspired by Prometheus. It is designed to be very
cost effective and easy to operate. It does not index the contents
of the logs, but rather a set of labels for each log stream.
snap-id: oBiYXQH82afIGjSn57Uu453ccXLXY7Vy
channels:
latest/stable: 2.4.1 2021-11-22 (1) 43MB -
latest/candidate: ↑
latest/beta: ↑
latest/edge: ↑
rock/stable: –
rock/candidate: –
rock/beta: –
rock/edge: 2.4.2 2022-04-06 (34) 43MB -
20.04/stable: –
20.04/candidate: –
20.04/beta: –
20.04/edge: 2.4.1 2021-11-22 (8) 43MB -
こっちにもありますが、更に古い 2.4.1。
Ubuntu 24.04になってからは特殊な事情が無い限りサーバー用は aptのパッケージで入れようと思っているので aptの方を使うことにします。
こちらの方が新しいですしね。
ここで一つ。
手順では [loki]・[promtail] の 2パッケージをインストールするよう書いています。
前者が Loki本体として、後者はログデータを Lokiに送信するエージェントです。
一緒に入れるのは、Lokiのサーバー自体のログもまた Lokiに送って管理しようって目的なんだと思います。
しかし当の Grafana側では「今後 Grafana Agentや promtailではなく、新プロダクトの Grafana Alloyを使ってね」って言ってるんですわ。
ですので、ここでは [promtail]パッケージはインストールしません。
(Alloyは後で入れるつもりですが)
では Lokiをインストールしましょう。
大して長くなかったので、参考に全部載せますね。
subro@GrafanaLoki:~$ sudo apt -y install loki
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了
状態情報を読み取っています... 完了
提案パッケージ:
loki-doc
以下のパッケージが新たにインストールされます:
loki
アップグレード: 0 個、新規インストール: 1 個、削除: 0 個、保留: 0 個。
357 kB のアーカイブを取得する必要があります。
この操作後に追加で 925 kB のディスク容量が消費されます。
取得:1 http://jp.archive.ubuntu.com/ubuntu noble/universe amd64 loki amd64 2.4.7.4-10 [357 kB]
357 kB を 2秒 で取得しました (145 kB/s)
以前に未選択のパッケージ loki を選択しています。
(データベースを読み込んでいます ... 現在 83510 個のファイルとディレクトリがインストールされています。)
.../loki_2.4.7.4-10_amd64.deb を展開する準備をしています ...
loki (2.4.7.4-10) を展開しています...
loki (2.4.7.4-10) を設定しています ...
man-db (2.12.0-4build2) のトリガを処理しています ...
Scanning processes...
Scanning linux images...
Running kernel seems to be up-to-date.
No services need to be restarted.
No containers need to be restarted.
No user sessions are running outdated binaries.
No VM guests are running outdated hypervisor (qemu) binaries on this host.
インストールできました。
しかし [loki]パッケージは systemdでの起動に対応していないようで、どこに何が入っているやらです。
パッケージの中身を確認してみます。
subro@GrafanaLoki:~$ dpkg -L loki
/.
/usr
/usr/bin
/usr/bin/hist
/usr/bin/loki
/usr/bin/loki_count
/usr/bin/loki_dist
/usr/bin/loki_ext
/usr/bin/loki_freq
/usr/bin/loki_sort_error
/usr/bin/prep
/usr/bin/qavg
/usr/share
/usr/share/doc
/usr/share/doc/loki
/usr/share/doc/loki/README
/usr/share/doc/loki/README.Debian
/usr/share/doc/loki/README.known_systems
/usr/share/doc/loki/README.multiple_records
/usr/share/doc/loki/README.parallel_runs
/usr/share/doc/loki/README.test
/usr/share/doc/loki/changelog.Debian.gz
/usr/share/doc/loki/copyright
/usr/share/doc/loki/examples
/usr/share/doc/loki/examples/control_jv
/usr/share/doc/loki/examples/control_jv1
/usr/share/doc/loki/examples/control_jv_cens
/usr/share/doc/loki/examples/control_jv_lm
/usr/share/doc/loki/examples/control_jv_mg
/usr/share/doc/loki/examples/jvped
/usr/share/doc/loki/examples/jvped1
/usr/share/doc/loki/examples/param_gaw9
/usr/share/doc/loki/examples/param_jv
/usr/share/doc/loki/examples/param_jv2
/usr/share/doc/loki/examples/param_jv_lm
/usr/share/doc/loki/examples/param_jv_mg
/usr/share/doc/loki/examples/test_seedfile
/usr/share/doc/loki/run-unit-test
/usr/share/man
/usr/share/man/man1
/usr/share/man/man1/loki.1.gz
/usr/share/man/man1/hist.1.gz
/usr/share/man/man1/loki_count.1.gz
/usr/share/man/man1/loki_dist.1.gz
/usr/share/man/man1/loki_ext.1.gz
/usr/share/man/man1/loki_freq.1.gz
/usr/share/man/man1/loki_sort_error.1.gz
/usr/share/man/man1/prep.1.gz
/usr/share/man/man1/qavg.1.gz
ん〜、何でしょうね、これは。
設定ファイルの雛形も無く、実行ファイルとドキュメントだけ。
この後 GitHubから Loki起動時に必要な設定ファイル取り寄せて Lokiを実行しましたが、設定の誤りではなく「-(ハイフン)で始まるオプションなんて無い!」って引数エラーになってしまいます。
「ええっ?!」と思いつつ試行錯誤しながらいくらやってもダメなので、この方法は諦めることにしました。
2.Grafana Lokiインストール(成功編)
中心になる Grafana Lokiのサーバーを作ります。
Ubuntu Serverはマシン名を [GrafanaLoki]、IPアドレスを [192.168.1.115] で作ってあります。
ドキュメントの(コンテナなどと並んで)ローカルインストールの箇所はこちら。
Local
これに従ってインストールしていきます。
Ubuntuではデフォルトのパッケージリポジトリからインストールするように書いてありましたが、何となく嫌なので 「Install manually」の段落に従い、手動でインストールします。
ここで一つ。
手順では Lokiと Promtailをインストールするよう書いています。
Promtailはログデータを Lokiに送信するエージェントです。
一緒に入れるのは、Lokiのサーバー自体のログもまた Lokiに送って管理しようって目的なんだと思います。
しかし当の Grafana側では「今後 Grafana Agentや promtailではなく、新プロダクトの Grafana Alloyを使ってね」って言ってるんですわ。
ですので、ここでは Promtailはインストールしません。
(Alloyは後で入れるつもりですが)
まず GitHubから debパッケージを手に入れます。
2024年5月18日時点の最新バージョンは 3.0.0で、メジャーバージョンアップしたばかりでした。
ダウンロードは GitHubのこちらからできます。
Ubuntuでは Assetsにある [loki_3.0.0_amd64.deb] が対象です。
Loki 3.0.0
とか言いつつ、curlコマンドでダウンロードしてしまいます。
subro@GrafanaLoki:~$ curl -O https://github.com/grafana/loki/releases/download/v3.0.0/loki_3.0.0_amd64.deb
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
subro@GrafanaLoki:~$ ls -l loki_3.0.0_amd64.deb
-rw-rw-r-- 1 subro subro 0 5月 16 22:57 loki_3.0.0_amd64.deb
ダウンロードが完了して [loki_3.0.0_amd64.deb]ファイルができました。
インストールします。
subro@GrafanaLoki:~$ sudo apt -y install ./loki_3.0.0_amd64.deb
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了
状態情報を読み取っています... 完了
注意、'./loki_3.0.0_amd64.deb' の代わりに 'loki' を選択します
以下のパッケージが新たにインストールされます:
loki
アップグレード: 0 個、新規インストール: 1 個、削除: 0 個、保留: 0 個。
22.6 MB 中 0 B のアーカイブを取得する必要があります。
この操作後に追加で 72.4 MB のディスク容量が消費されます。
取得:1 /home/subro/loki_3.0.0_amd64.deb loki amd64 3.0.0 [22.6 MB]
以前に未選択のパッケージ loki を選択しています。
(データベースを読み込んでいます ... 現在 83512 個のファイルとディレクトリがインストールされています。)
.../subro/loki_3.0.0_amd64.deb を展開する準備をしています ...
loki (3.0.0) を展開しています...
loki (3.0.0) を設定しています ...
新バージョンの設定ファイル /etc/loki/config.yml をインストールしています ...
Scanning processes...
Scanning candidates...
Scanning linux images...
Running kernel seems to be up-to-date.
Restarting services...
systemctl restart loki.service
No containers need to be restarted.
No user sessions are running outdated binaries.
No VM guests are running outdated hypervisor (qemu) binaries on this host.
N: ファイル '/home/subro/loki_3.0.0_amd64.deb' がユーザ '_apt' からアクセスできないため、ダウンロードは root でサンドボックスを通さずに行われます。 - pkgAcquire::Run (13: 許可がありません)
インストールできました。
この時点で既に立ち上がってるんで、本来 Grafanaから WebAPIにアクセスするところ、実験で無理やり Firefoxからつついてみます。
私の環境では [http://GrafanaLoki:3100] になり、適当な WebAPIを叩くとして、[http://GrafanaLoki:3100/loki/api/v1/index/volume]をやってみました。
まぁ、ちゃんと何かが反応しているのが分かりました。
3.Grafanaインストール
Ubuntu Serverはマシン名を [Grafana]、IPアドレスを [192.168.1.116] にしてあります。
「Grafanaでカッコイイグラフを作る」の手順で概ねOKのはずですが、最新の手順を見ると標準Cライブラリに [musl](マッスル)を使うようになってるようなので、改めて最新手順でやります。
Grafanaインストール手順は以下に。
Ubuntuは「Ubuntu and Debian」の段落になります。
Download Grafana
2024年5月18日時点の最新バージョンは 11.0.0でこちらもメジャーバージョンアップしたばかり。
前提になるパッケージをインストールします。
subro@Grafana:~$ sudo apt-get install -y adduser libfontconfig1 musl
〜〜〜 省略 〜〜〜
インストールできました。
Grafanaのパッケージをダウンロードします。
subro@Grafana:~$ wget https://dl.grafana.com/oss/release/grafana_11.0.0_amd64.deb
--2024-05-17 08:18:41-- https://dl.grafana.com/oss/release/grafana_11.0.0_amd64.deb
dl.grafana.com (dl.grafana.com) をDNSに問いあわせています... 2a04:4e42:2e::729, 151.101.42.217
dl.grafana.com (dl.grafana.com)|2a04:4e42:2e::729|:443 に接続しています... 失敗しました: 接続を拒否されました.
dl.grafana.com (dl.grafana.com)|151.101.42.217|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 114840406 (110M) [application/octet-stream]
‘grafana_11.0.0_amd64.deb’ に保存中
grafana_11.0.0_amd64.deb 100%[=====================>] 109.52M 8.10MB/s in 17s
2024-05-17 08:18:59 (6.51 MB/s) - ‘grafana_11.0.0_amd64.deb’ へ保存完了 [114840406/114840406]
subro@Grafana:~$ ls -l grafana_11.0.0_amd64.deb
-rw-rw-r-- 1 subro subro 114840406 5月 14 16:29 grafana_11.0.0_amd64.deb
ダウンロードが完了して [grafana_11.0.0_amd64.deb]ファイルができました。
Grafanaをインストールします。
subro@Grafana:~$ sudo dpkg -i grafana_11.0.0_amd64.deb
以前に未選択のパッケージ grafana を選択しています。
(データベースを読み込んでいます ... 現在 83523 個のファイルとディレクトリがインストールされています。)
grafana_11.0.0_amd64.deb を展開する準備をしています ...
grafana (11.0.0) を展開しています...
grafana (11.0.0) を設定しています ...
info: 100 から 999 の範囲でユーザーID を選択しています...
info: システムユーザ `grafana' (UID 110) を追加しています...
info: 新しいユーザ `grafana' (UID 110) をグループ `grafana' に追加しています...
info: ホームディレクトリ `/usr/share/grafana' は作成しません。
### NOT starting on installation, please execute the following statements to configure grafana to start automatically using systemd
sudo /bin/systemctl daemon-reload
sudo /bin/systemctl enable grafana-server
### You can start grafana-server by executing
sudo /bin/systemctl start grafana-server
ピンクの箇所を読むと、デフォルトでは systemdによる自動起動をしないようにしてあるようですので、自動起動するようにさせましょう。
systemdのサービスを自動起動するようにする手順の一般的なものです。
subro@Grafana:~$ sudo /bin/systemctl daemon-reload
subro@Grafana:~$ sudo /bin/systemctl enable grafana-server
Synchronizing state of grafana-server.service with SysV service script with /usr/lib/systemd/systemd-sysv-install.
Executing: /usr/lib/systemd/systemd-sysv-install enable grafana-server
Created symlink /etc/systemd/system/multi-user.target.wants/grafana-server.service → /usr/lib/systemd/system/grafana-server.service.
subro@Grafana:~$ sudo /bin/systemctl start grafana-server
何も表示されませんが、Grafanaが立ち上がりました。
[3000/tcp](http)で待ち受けていますので WEBブラウザでアクセスします。
私の環境では [http://Grafana:3000] です。
[Email or username] に「admin」、[Password] も「admin」です。
Log inを押します。
ログインできましたので、これはこのまま置いておきます。
残念ながら、日本語をタイトルなどに使えるものの、ダッシュボードの日本語化はありませんので諦めて下さい。
4.ログ収集対象
Windows Server 2022に Grafana Alloyをインストールして、Lokiにログを送信(プッシュ)します。
「Windows Server 2022 インストール」で作ったサーバーを利用します。
このサーバーはマシン名が [Win2022-1]、IPアドレスが [192.168.1.116] にしてあります。
多分 Lokiに格納されるログの発生元情報としてこれらが使われるでしょうから覚えておきます。
Grafana Alloyのインストールドキュメントのうち Windows用がこちら。
Install Grafana Alloy on Windows
手順に従ってやっていきます。
GitHubからダウンロードします。
2024年5月18日時点の最新バージョンは 1.1.0 で、以下からダウンロードできます。
1.1.0
Assetsにある [ alloy-installer-windows-amd64.exe.zip] が対象で、リンクをクリックするとダウンロードできます。
[Win2022-1]サーバーにダウンロードした状態です。
ZIP圧縮なので [すべて展開] で圧縮を解いたところ。
[alloy-installer-windwos-amd64.exe]フォルダの中。
[alloy-installer-windwos-amd64.exe]ファイルをダブルクリックします。
ライセンス条項を読んで同意できるなら、I Agreeを押します。
インストール先フォルダはここで良いでしょう。
Installを押します。
Closeを押します。
インストールできました。
インストール先フォルダの中身です。
ここにある [config.alloy]ファイルが設定ファイルなんで、中を見てみますとコレしか書かれていません。
これは Alloy自体のログをどのレベルで出力するかの設定です。
logging {
level = "info"
}
これだとどのログを取得対象にするか、送信先のLokiサーバーのありかも知らないはずですね。
以下 2の機能(Alloyでは「コンポーネント」と呼ぶようです)を付け足します。
Windowsイベントログを拾うのに以下を使います。
loki.source.windowsevent
Lokiサーバーに送信するのに以下を使います。
loki.write
[config.alloy]ファイルを以下のように書き換えました。
私の環境では [hosts]ファイルで名前解決できるようにしてあります。
logging {
level = "info"
}
loki.source.windowsevent "ApplicationEventLog" {
eventlog_name = "Application"
forward_to = [loki.write.sendloki.receiver]
}
loki.source.windowsevent "SystemEventLog" {
eventlog_name = "System"
forward_to = [loki.write.sendloki.receiver]
}
loki.source.windowsevent "SecurityEventLog" {
eventlog_name = "Security"
forward_to = [loki.write.sendloki.receiver]
}
loki.write "sendloki" {
endpoint {
url = "GrafanaLoki:3100/loki/api/v1/push"
}
}
ピンク字の箇所を紐付けると、[loki.source.windowsevent] で取得したログのデータが [sendloki] とラベル名のついた [loki.write] に渡ります。
[send.loki] の中で URLを指定する際に [/loki/api/v1/push] というパスをつけていますが、これが Lokiの WebAPIのうちデータを受け取る APIになります。
Alloyのサービスを再起動します。
C:\Users\Administrator>net stop alloy
.
Alloy サービスは正常に停止されました。
C:\Users\Administrator>net start alloy
Alloy サービスを開始します.
Alloy サービスは正常に開始されました。
再起動できました。
Windows Server側はこれで OKです。
5.Grafanaダッシュボードでログ閲覧
現時点でもう Lokiには、Windows Serverのイベントログのデータが溜まってきてますんで、Grafanaでクエリしましょう。
「3.Grafanaインストール」で残していた Grafanaのダッシュボードに戻ります。
データソースとして Lokiを登録します。
左のメニューから [Connections] - [Data sources] と選択します。
右ペインにこのように表示されますのでAdd data sourceを押します。
[Loki] がチョイ下にありますので、クリックします。
[URL] に [GrafanaLoki]サーバーの情報を入れます。
私の環境だと [http://GrafanaLoki:3100] になります。
一番下にあるSave & testを押します。
上手く接続できればこの表示が出ます。
データソースの登録は以上になります。
次にいよいよダッシュボードを作ります。
左のメニューから [Dashboards] を選択します。
右ペインに移ってCreate Dashboardを押します。
Add visualizationを押します。
[loki] を選択します。
こんな画面になりますので、下の方にある [Select label]プルダウンから [computer] を選択します。
右隣の [Select value]プルダウンからログを取得したマシンを選びます。
私の環境では [Win2022-1] を選びました。
Run queryを押します。
こんな画面になりますので [Switch to table] をクリックします。
データが取れました。\(^o^)/
画面右上のSaveを押します。
タイトルなどつけましてSaveを押します。
ダッシュボードができました。
6.考察
ダッシュボードでは [Line] 列が実際に見たい内容なんですが、Lokiの中でデータを保持する仕組みのためか、以下の文字がユニコードに変換されています。
文字 | 変換された状態 |
---|---|
< | \u0003c |
> | \u0003e |
人が読むためのメッセージ部分ではないので大きな問題にならないものの、何か見辛い…。
それからこれは Alloy・Loki・Grafanaに限った話ではないのですが、Windowsイベントログは木構造のログなんですけど、それを無理矢理 1行のテキストに纏めるため、やっぱり見辛いんですよね。
どこかに何か良い方法がないものかと思うところですが、見つけられていません。
==========
Grafanaのセットで、Windowsイベントログを集約し、ダッシュボードに表示する環境を作ってみましたが、一連のやり方の情報が少なくて結構難儀しました。
しかしこの作業を通して Lokiと Alloyがどういうソフトなのか理解が進んだと思いました。
Linuxのマシンに Alloyをインストールするのも、Windowsにやったのと大差ないでしょうから、応用でいけると思います。
Alloyについては「コンポーネント」を数珠繋ぎにしていくつもの処理を行わせることができるようですから、工夫すれば 1つのログデータからアレコレとできそうに思われます。
Grafanaのダッシュボードを使う時に常に思うのは「もっとデザイン力が欲しいわ…」ということで、こればかりはどうにもならず、「キレイでカッコイイ画面作りたい…」ていつも思いますね。
これは Lokiじゃなくて Grafanaの本ですが、こういうのを編集してもらえるのは助かります。