CoreOS 上の全てのログをリモートサーバへ送る


概要

CoreOS 上で出る全てのログをリモートのログサーバへ送るという話。
CoreOS には systemd が入っており、全てのサービスを systemd 経由で管理すると systemd 付属の jounalctl によってログが一元管理できる。 CoreOS マシンを disposable にしておくために一元管理したログをリモートサーバへ送る

ログのルーティング

収集したログは ncat のコネクトモードを使ってログ保存先の listen ポートへ UDP データとして送る。

$ journalctl -o short -f | ncat remote-destination.com 12345

ログのルーティング先は色々ある。

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