AWS CloudWatch Logsを見やすくするツールを作った

# 概要
AWS CloudWatch Logsの表示が見にくすぎるというのは全人類が抱える問題だと思いますが、それを見やすくするCLIツールを作りました。

既に[awslogs](https://github.com/jorgebastida/awslogs)というツールがあり、こちらも便利なのですがロググループをまたいでtailすることが出来なかったので自分で作りました。
~~あと個人的にはPythonのCLIツールをグローバルに入れたくな...~~
他にもいくつかツールあり、そちらと比べて機能的に大きく異なるわけではないので、今困ってない人は良いと思います。色合いが良い感じとかふわっとした部分は結構違うと思います。

# Utern
以下に置いてあります。
https://github.com/knqyf263/utern

[stern](https://github.com/wercker/stern)というKubernetesでログを表示するのに使われる便利なツールがあるのですが、それを参考に作ったのでuternというツール名にしました。意味は特にないです。
<img src="https://qiita-image-store.s3.amazonaws.com/0/56222/71614a65-b19a-9576-7438-569ad195941a.png" width=50%>

# 使い方
AWSのAPI実行用の認証情報は `~/.aws/config` や `~/.aws/credentials` から取得するので、事前にawscliが使える必要があります。

それさえ設定されていれば、単にロググループにマッチする文字列を渡せばよいだけです。正規表現も使えます。

![utern.gif](https://qiita-image-store.s3.amazonaws.com/0/56222/57e74d3a-3844-4528-b0ef-9b43e5aec710.gif)


上のGIFだとserverという文字列を渡しているので、serverにマッチするロググループを探します（proxy-serverとweb-server）。そしてそのロググループ内のログストリームを全て取得します（proxy01, proxy02, web01, web02, web03）。
あとはそれらの全てのログをtailします。

説明は以上です。とにかくシンプルに使えるツールにしたかったので、使い始めるのにこれ以外知るべきことはありません。シンプル！簡単！便利！

何も指定しないと5分前以降のログを表示するため、5分間のログが全くない場合は何も表示されません。後述の時刻指定オプションを利用して下さい。

# 機能
メインの機能について紹介します

- **複数のロググループを指定可能**
    - ロググループ名を正規表現で渡せるため、異なるロググループでも同時に表示できます
    - これは他のツールでは出来ないと思います
- **複数のログストリームを指定可能**
    - ログストリーム名を正規表現で渡せるため、異なるログストリームでも同時に表示できます（省略すると全て）
- **ロググループやログストリームごとに異なる色が自動で付けられる**
    - どの行が同じログストリームのログか、などがすぐ分かります
    - sternで気に入っているところだったのでパクりました
- 時刻指定が柔軟
    - 5分前以降のログが見たい場合に5mのように書けます
    - 2019-01-02T03:04:05ZのようなRFC3339に準拠した時刻指定も可能です
- フィルタリング
    - ログ文字列によるフィルタリングが可能です
- インストールが簡単
    - ビルドしたバイナリを[Releases](https://github.com/knqyf263/utern/releases)に置いてあります
    - Homebrew経由でもインストール可能です

# コマンド例

### ロググループのリスト表示
初っ端からuternのコマンド例じゃないのですが、ロググループの表示をするためのawsコマンドを貼っておきます。
uternは単機能に絞りたかったのであえてリスト表示機能はつけてません。
ただ内部的には同じAPIを叩いているため、実装する場合は数行足せばいけます。
awsコマンドいちいち打つの面倒だから付けてくれと言われたら考えますが、一旦 `Small is beautiful`の精神でやっています。

```console
$ aws logs describe-log-groups --query "logGroups[].[logGroupName]" --output text
```

### ログストリームのリスト表示

```console
$ aws logs describe-log-streams --log-group-name log-group-name --query "logStreams[].[logStreamName]" --output text
```

### 正規表現によるロググループのフィルタ

```console
$ utern "web-\w"
```

### ログストリームのフィルタ
`--stream` は `-n` でも指定可能です

```console
$ utern --stream log-stream-query log-group-query
```

### ログストリームのprefixによるフィルタ
更新されるロググループが大量にある場合は、上のフィルタだと遅くなる可能性があります。
その場合は`--stream-prefix`を使うとAWSのAPIで直接フィルタできるため、上の単純な文字列指定より高速になります。
`--stream-prefix` は `-p` でも指定可能です。

```console
$ utern --stream-prefix log-stream-prefix log-group-query
```

### ログストリームの正規表現とprefixによるフィルタ
prefixである程度絞ったあとに文字列一致にすると高速かつ柔軟にフィルタ可能です

```console
$ utern --stream-prefix log-stream-prefix --stream log-stream-query log-group-query
```

### 1時間以内のログを表示
`--since` は `-s` でも指定可能です

```console
$ utern --since 1h log-group-query
```

### 2019-01-02 03:04:05 JST以降のログを表示
RFC3339に準拠している形で指定可能

```console
$ utern --since 2019-01-02T03:04:05+09:00 log-group-query
```

### 10分前から5分前のログを表示
この場合はtailされずログを表示した時点で終了します。
`--end` は `-e` でも指定可能です

```console
$ utern --since 10m --end 5m log-group-query
```

### ロググループ名を表示しない

```console
$ utern --no-log-group log-group-query
```

### ログストリーム名を表示しない

```console
$ utern --no-log-stream log-stream-query
```

### ログメッセージの先頭10文字だけ表示

```console
$ utern --max-length 10 log-stream-query
```


# オプション

```sh
NAME:
   utern - Multi group and stream log tailing for AWS CloudWatch Logs

USAGE:
   utern [global options] log-group-query

VERSION:
   0.0.1

COMMANDS:
     help, h  Shows a list of commands or help for one command

GLOBAL OPTIONS:
   --stream value, -n value         Log stream name (regular expression). Displays all if omitted.
   --stream-prefix value, -p value  Log stream name prefix. If a log group contains many log streams, this option makesit faster.
   --since value, -s value          Return logs newer than a relative duration like 52, 2m, or 3h. (default: "72h")
   --end value, -e value            Return logs older than a relative duration like 0, 2m, or 3h.
   --filter value                   The filter pattern to use. For more information, see https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/FilterAndPatternSyntax.html.
   --timestamps                     Print timestamps
   --event-id                       Print event ID
   --no-log-group                   Suppress display of log group name
   --no-log-stream                  Suppress display of log stream name
   --max-length value               Maximum log message length (default: 0)
   --help, -h                       show help
   --version, -v                    print the version
```

# インストール

## Mac
Macの場合はHomebrew経由でインストール可能です

```console
$ brew tap knqyf263/utern
$ brew install knqyf263/utern/utern
```

## その他
rpmやdebパッケージなどもありますし、ビルド済みのバイナリも置いてあるので環境に合わせてインストールして下さい
https://github.com/knqyf263/utern/releases

# 今後について
まだv0.0.1でバグがあるはずなので直していきます。
AWSのAPIの制限で一部実行が遅い部分があるので高速化も考えます。


# 最後に
普段使ってるsternが便利で、何でこういうツールがCloudWatch Logsにはないんだ！！とカッとなって1日で作りました。
ずっと不便な思いをしてたので、このツールのおかげで捗るようになって自分は助かってます。

もし同じ気持ちを抱いている方がいましたら一度使ってみて頂けると幸いです。