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


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

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

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


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

* [Papertrail](https://papertrailapp.com)
* [Logentries](https://logentries.com)
* [Loggly](https://www.loggly.com)
* [Datadog](https://www.datadoghq.com)
* [Splunk](http://www.splunk.com)
* [Fluentd](http://www.fluentd.org/) (OSS)
* [Logstash](http://logstash.net) (OSS)
* [Graylog2](http://graylog2.org) (OSS)

### Logentries へルーティングする例
Logentries は固有ポートへの Plain TCP, UDP 経由で送ると、送信元 IP で判別するので、CoreOS マシンを捨てられなくなる。Logentries へは [Token ベースで送信する](https://logentries.com/doc/input-token/)

```bash
core@core-01 ~ $ journalctl -o short -f | sed \"s/^/<YOUR_TOKEN> \\0/g\" | ncat data.logentries.com 10000"
```

json 形式で送る

```bash
core@core-01 ~ $ journalctl -o json -f | sed \"s/^/<YOUR_TOKEN> \\0/g\" | ncat data.logentries.com 10000"
```

## Cloud-Config で起動する

```yaml
#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 の設定例

![](https://qiita-image-store.s3.amazonaws.com/0/20833/9ee6e289-259d-5055-a563-069ef8017efd.png)

![host___Logentries.png](https://qiita-image-store.s3.amazonaws.com/0/20833/ad9b5eb6-a089-99a6-a0f1-83a6e5b542dd.png "host___Logentries.png")

![host___Logentries.png](https://qiita-image-store.s3.amazonaws.com/0/20833/ba5d98c5-2545-d2b2-76fd-5f7ab2c681f9.png "host___Logentries.png")

![host___Logentries.png](https://qiita-image-store.s3.amazonaws.com/0/20833/89bcaa6b-7d94-4f70-b5e7-1d5c8ccfa2ad.png "host___Logentries.png")

![host___Logentries_と_CoreOS_上の全てのログをリモートサーバへ送る.png](https://qiita-image-store.s3.amazonaws.com/0/20833/73fc3a84-7374-e6e6-dc28-82edbc7281a6.png "host___Logentries_と_CoreOS_上の全てのログをリモートサーバへ送る.png")



## メモと感想
### 各コンテナの起動失敗等のログも欲しいので一番最初に起動するよう書く
units の一番上に書けばいいんだと思う

## REF

* [CoreOS logging to remote destinations](https://medium.com/coreos-linux-for-massive-server-deployments/coreos-logging-to-remote-destinations-defb984185c5)
* [CoreOSをLogentriesでログ監視してみた - uzyexeのノート](https://www.instapaper.com/read/509284528) - 自分も logentries ユーザなのでジャストな記事でした