概要
CoreOS 上で出る全てのログをリモートのログサーバへ送るという話。
CoreOS には systemd が入っており、全てのサービスを systemd 経由で管理すると systemd 付属の jounalctl によってログが一元管理できる。 CoreOS マシンを disposable にしておくために一元管理したログをリモートサーバへ送る
ログのルーティング
収集したログは ncat
のコネクトモードを使ってログ保存先の listen ポートへ UDP データとして送る。
$ journalctl -o short -f | ncat remote-destination.com 12345
ログのルーティング先は色々ある。
- Papertrail
- Logentries
- Loggly
- Datadog
- Splunk
- Fluentd (OSS)
- Logstash (OSS)
- Graylog2 (OSS)
Logentries へルーティングする例
Logentries は固有ポートへの Plain TCP, UDP 経由で送ると、送信元 IP で判別するので、CoreOS マシンを捨てられなくなる。Logentries へは Token ベースで送信する
core@core-01 ~ $ journalctl -o short -f | sed \"s/^/<YOUR_TOKEN> \\0/g\" | ncat data.logentries.com 10000"
json 形式で送る
core@core-01 ~ $ journalctl -o json -f | sed \"s/^/<YOUR_TOKEN> \\0/g\" | ncat data.logentries.com 10000"
Cloud-Config で起動する
#cloud-config
coreos:
update:
group: stable
etcd:
discovery: https://discovery.etcd.io/xxxxxxxxxxxxxxxxxxx
addr: $public_ipv4:4001
peer-addr: $public_ipv4:7001
fleet:
public-ip: $public_ipv4
units:
- name: journal-router-short.service
command: start
content: |
[Unit]
Description=Journal Router (short)
[Service]
TimeoutStartSec=0
ExecStart=/bin/sh -c '/usr/bin/journalctl -o short -f | sed \"s/^/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx \\0/g\" | ncat data.logentries.com 10000'
[Install]
WantedBy=multi-user.target
- name: journal-router-json.service
command: start
content: |
[Unit]
Description=Journal Router (json)
[Service]
TimeoutStartSec=0
ExecStart=/bin/sh -c '/usr/bin/journalctl -o json -f | sed \"s/^/xxxxxxxxxxxxxxxxxxxxxxxxxxxx \\0/g\" | ncat data.logentries.com 10000'
[Install]
WantedBy=multi-user.target
- human readable なログとして short 、後で詳細を調べる、ログを使って何かするときのために json ログともに送信しておく
補足: Logentries の設定例
メモと感想
各コンテナの起動失敗等のログも欲しいので一番最初に起動するよう書く
units の一番上に書けばいいんだと思う
REF
- CoreOS logging to remote destinations
- CoreOSをLogentriesでログ監視してみた - uzyexeのノート - 自分も logentries ユーザなのでジャストな記事でした