0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Syslog サーバーを docker-compose の OpenObserve でたててみた

Last updated at Posted at 2024-05-27

目的

ネットワーク機器の検証などで多数の機器のログを纏めて見たいため

方針

長時間運用を考えず、必要なときに作っていらなくなったら壊す運用

できたもの

これ

名前は syslog-ng ➡ Fluentd ➡ OpenObserve とデータが流れるので並べてみた。

使うに当たって変更が必要な箇所

OpenObserv へブラウザからログインするための e-mail addr, password
を設定してください。
また、fluentd が OpenObserv ログを投げるときにもその email-addr, password
を使いますので fluentd.conf にも同じものを設定してください。

openobserve/.env の以下の部分

.env
ZO_ROOT_USER_EMAIL=root@root.root  👈
ZO_ROOT_USER_PASSWORD=root         👈

fluentd/conf/fluent.conf の以下の部分

fluent.conf
  <auth>
    method basic
    username root@root.root    👈
    password root              👈
  </auth>

Fluentd を経由せず OpenObserve にデータを投げるときは
syslog-ng/conf/syslog-ng.conf の以下の部分

syslog-ng.conf
destination d_openobserve {
  openobserve-log(
    url("http://openobserve")
    port(5080)
    stream("syslog-ng")
    user("root@root.root")     👈
    password("root")           👈

見ての通り、syslog-ng から OpenObserve へ投げるプリセットが用意されているので、syslog だけで済むのなら Fluentd は要らなかったかもしれない。

起動方法

docker-compose.yml のあるディレクトリで docker compose up -d
コンテナをダウンロードし、起動します。
停止は同じディレクトリでdocker compose down。これでコンテナも削除されます。

データの流れ

ログを見るにはブラウザで docker が動いている機械の 5080 番ポートへ
アクセスしてください。
ユーザ名とパスワードは
openobserve/.env と fluentd/conf/fluent.conf で書き換えたものです

使っている永続ボリューム

一部、コンテナからホストへデータやログを書き込んでいます。そのため、コンテナを再起動してもデータは消えませんが、手動で消さない限り残り続けてしまいます。

  1. syslog-ng
    起動すると syslog-ng のログが syslog-ng/conf/log/current に吐かれます。syslog-ng.conf の設定ミス確認などに使えるため残していますが、不要であれば
    ボリュームの設定部分
    volumes:
      - ./syslog-ng/conf/:/config/

    volumes:
      - ./syslog-ng/conf/syslog-ng.conf:/config/syslog-ng.conf

等に変更してください。
長期稼働させるとログが膨らむ可能性がありますので注意。

  1. OpenObserve
    OpenObserve のデータも openobserve/data/ 以下に保存されます。
    使い終わったら消しましょう。

作ってみて

実際作ってみたら、ログが出て表示まで10秒~1分以上かかり、順番も入れ替わってしまうためリアルタイムでの確認用途には向いていないことがわかりました。
image.png
メッセージ部分がメッセージを生成した時刻、タイムスタンプはどこか分からないけど、どこかのアプリケーションで受信した時刻。

syslog-ng.conf を↓のように追加して直接ファイルを吐かせ、tail -f で見た方がずっと良い。

destination d_test {            # 👈 以下 3行追加
  file("/config/log/test.log"); # 👈
};                              # 👈

log {
  source(s_tcp);
  source(s_udp);
  source(s_internal);
  destination(d_fluentd);
  destination(d_test);          # 👈 追加
};

もう少し高速化の方法はないものか。
OpenObserve は速度よりも圧縮を書けて大量のログを蓄積できるのが売りなので用途が違うんでしょうね。

うちの部署では 3CDaemon を使ってる人も居るレベルなので職場でこれを広めるのは「遅い」、「取り回しが悪い」と、無理だろうな。...(せめて TFTPD64 にして欲しい)

どうも反映が遅いので

fluentd を経由せず syslog-ng から直接 OpenObserve へ投げてみる。

ルート1 : 機器 → syslog-ng → Fluentd → OpenObserv (ストリーム : default)
ルート2 : 機器 → syslog-ng → OpenObserv (ストリーム : syslog-ng)

↓この設定時点のハッシュ

それぞれのスクリーンショット
Fluentd 経由の場合、メッセージ内の時刻と OpenObserve のタイムスタンプが 20分ぐらいずれている。➡ 20分前のログが表示される。 (1日経つと 2時間ぐらいずれる)
image.png

syslog-ng から直接 OpenObserve へ送信した場合、タイムスタンプがほぼ同じで表示もそれほど遅れない。(1日経っても 3秒ぐらい)
image.png

そして、Fluentd 経由だとログの件数が少ない。
image.png

その後、1日ほど経過し 3時間近くずれてました😖
image.png

Fluentd って難しいですね。

その後の Flentd 経由のログ
image.png
1日以上遅れ、長時間バッファリングされるため順番もバラバラ。何が悪いんでしょうねぇ。

その後の syslog-ng 直送のログ
image.png
タイムスタンプはメッセージを読み取ったものという気もするが、発生から表示までの遅延は数秒程度。

めも

特定の文字列を除外する検索方法。(SQL)
FROM "default" は実際のストリーム名を指定してください。

SELECT * FROM "default" where NOT (match_all('除外したい文字列')) ORDER BY _timestamp DESC
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?