2
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?

More than 5 years have passed since last update.

Docker Container内のログ(nginx)をSplunkにpush送信する方法

Last updated at Posted at 2019-09-28

まとめの背景

  • dockerコンテナ関連のログのSplunkへの出力方法は2015年からいくつか存在していた
  • コンテナのログの集め方はそれぞれ特性があり、調べた2019.09.28時点で感じたのは、日々コンテナ周りの技術進化のスピードが速く、取り込み方法もケースバイケースで使い分けする必要がありそう
  • Docker単体でなく、k8sを経由してログを収集するモジュールもある(Splunk Connect for Kubernetes)
  • とりあえず今回はSplunk Connect for Dockerを使ってコンテナ内のデータをどのように収集できるのか検証を実施

Splunk Connect for Dockerのポイント

  • Dockerからplugin経由でpushでログを飛ばす仕組みです。Splunk側はHECで受け取る。
  • コンテナログはjson, inline(default), rawの3つのフォーマットで出力が可能

手順

Docker環境の準備

  • Amazon Linux release 2 (Karoo)で構築

  • ※AWS Market Placeのdockerホストはいまいち。2017年公開のもののためkernelが古かったり、splunk containerが起動しなかったり。。

  • 利用したdockerのversion

# docker version
Client version: 1.7.0-dev
Client API version: 1.19
Go version (client): go1.8.3
Git commit (client): 582db78
OS/Arch (client): freebsd/amd64
Server version: 1.7.0-dev
Server API version: 1.19
Go version (server): go1.8.3
Git commit (server): 582db78
OS/Arch (server): freebsd/amd64
  • DockerイメージのDL(nginx)今回はnginxを利用。
# docker pull nginx

Splunk Connect for Dockerの準備

スクリーンショット 2019-09-28 17.36.00.png

pluginのインストール

# docker plugin install splunk/docker-logging-plugin:latest --alias splunk-logging-plugin

pluginの有効化を確認

# docker plugin ls
ID                  NAME                           DESCRIPTION             ENABLED
35530a1a22e5        splunk-logging-plugin:latest   Splunk Logging Plugin   true

Splunk設定(HTTP Event Collector(HEC))

HECのグローバル設定の有効化

  • グローバル設定をクリック
スクリーンショット 2019-09-28 16.20.57.png
  • 以下のようなパラメータを設定
スクリーンショット 2019-09-28 16.19.44.png

HECトークンの新規作成

  • 設定 - データ入力 - HTTPイベントコレクタの新規追加
スクリーンショット 2019-09-28 16.13.48.png
  • HTTPイベントコレクタの名前を入力し、次へ
スクリーンショット 2019-09-28 16.14.32.png
  • とりあえずsourcetypeは自動でindexはdockerを作成
スクリーンショット 2019-09-28 16.15.15.png

Dockerイメージの起動(nginx)

  • splunk-logging-driverを読みこみながら、nginxを起動

# docker run -it -d -p 80:80 --log-driver=splunk-logging-plugin \
           --log-opt splunk-token=c7d0854b-b0d5-xxxx-xxxx-xxxxxxxxxxx \
           --log-opt splunk-url=https://13.xxx.xxx.xx:8088 \
           --log-opt splunk-insecureskipverify=true \
           --log-opt splunk-index=docker \
       nginx

splunk-loggin-pluginをログドライバーにセット。オプション-dをつけることでバックグランドで動作します。-p 80:80とすることで、ホストのポート80がコンテナのポート80にマップ。
run -it -d -p 80:80 --log-driver=splunk-logging-plugin
HECのtokenをセット
--log-opt splunk-token=c7d0854b-b0d5-xxxx-xxxx-xxxxxxxxxxx
HECのURLをセット
--log-opt splunk-url=https://13.xxx.xxx.xx:8088
SSL証明書チェックを無視
--log-opt splunk-insecureskipverify=true
index=dockerに保存
--log-opt splunk-index=docker
nginxイメージを起動
nginx

  • Docker のログ出力先として、splunk-logging-pluginが読み込まれていることを確認
# docker inspect  0ab8e00dccd4 |grep log
                "Type": "splunk-logging-plugin”,
  • dockerコンテナのSTATUS正常に起動していることを確認
# docker ps -a
CONTAINER ID        IMAGE                                 COMMAND                  CREATED             STATUS                PORTS                                   NAMES
44fb61ee4ed3        nginx                                 "nginx -g 'daemon of…"   2 hours ago         Up About an hour      0.0.0.0:80->80/tcp                      compassionate_jones

*Exited(1)などは何かしら正常に動いていないことをしめす

About a minute ago Exited (1) About a minute ago

*そんなときは下記コマンドで原因のログを調査

# docker logs (コンテナID) 
Error response from daemon: configured logging driver does not support reading

ログの取得を確認

  • **http://(GlobalIP)**でWebアクセス
スクリーンショット 2019-09-28 17.35.08.png
  • Splunkにログが届くことを確認
スクリーンショット 2019-09-28 17.15.52.png
  • nginxのコンテナイメージの場合、標準でaccess_logとerror_logをコンテナのログ出力対象(/dev/stdout, /dev/stderr)に設定されている模様
root@44fb61ee4ed3:/var/log/nginx# ls -la
total 0
drwxr-xr-x 1 root root 41 Sep 12 14:37 .
drwxr-xr-x 1 root root 63 Sep 28 06:32 ..
lrwxrwxrwx 1 root root 11 Sep 12 14:37 access.log -> /dev/stdout
lrwxrwxrwx 1 root root 11 Sep 12 14:37 error.log -> /dev/stderr

フィールドの抽出

  • はい、ただ残念ながら1ラインのログの場合、よくあるapacheのTAを使って自動的にフィールド抽出がされません。これがlogging-driverの制限かな。json形式のアプリケーションログだったらおそらくsplunkに入るときにキレイにパーシングされるとは思います。
スクリーンショット 2019-09-28 17.15.52.png
  • でも、必要なフィールド抽出はsplunkが得意なところ。
スクリーンショット 2019-09-28 17.22.43.png
  • Scheme on the Fly!
スクリーンショット 2019-09-28 17.22.52.png
  • はい、webアクセスログは楽な方。フィールド抽出できました。
スクリーンショット 2019-09-28 17.24.53.png

注意点

  • 1コンテナ内で生成されるデータに対して1種類のsourcetypeの指定まではできる。とはいえコンテナ内に複数種類のログソースがある場合、もうちょっとスマートに取りたいところ

--log-opt splunk-sourcetype=access_combined

まとめ

  • とりあえずコンテナのデータをsyslogサーバに飛ばしておく感覚でSplunkに飛ばすことは簡単に可能
  • あとはスキーマオンザフライの力を使って必要なフィールドを後から抽出していく
  • もう一周くらいまでばコンテナ関連のデータをもっと効率的に集める仕組みが確立されるかもしれないと期待して、.conf2019に期待

参照リンク

SplunkでDocker運用監視
Dockerコンテナ内のログをSplunkに入れてみた
SplunkでKubernetesのログとメトリクスを監視してみよう

2
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
2
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?