LogをNew Relicに移しても、今まで通りgrepもしたいのよ

# New Relic用grepコマンド

## はじめに

大量のログを保存して瞬時に検索が出来たり、ダッシュボードを作成してログから抽出した様々なメトリックスを可視化出来るようなサービスがいろいろあります。
そんなサービスのひとつ、New Relicを触る機会がありました。

大量のログを入れてみましたが、検索はめちゃめちゃ高速です。
対象のサーバーにログインして、対象の日付のログファイルを探して、grepして・・・なんてしなくても、全てのログをまとめて検索できてしまいます。

しかし、便利なのですが、うーん、Webのかっこいい画面で検索してログを見るのも、ま、いいのはいいのですが、やっぱり、コンソールでgrepをパイプでつないでごにょごにょしたいのです。

ということで、New Relicにため込んだログをgrepするコマンドを作りました。
題して、`nrgrep` (ヌルグレップ)です。

ソースから見たい人はこちらです。

https://github.com/hirachan/newrelic-grep

## インストール

Pythonで書いたので、PyPIに置いておきました。

https://pypi.org/project/newrelic-grep/

pipでインストールできます。

```console
pip install newrelic-grep
```

## 事前準備

APIを使用するので、USERのAPI KEYとアカウントIDが必要です。
それぞれを取得して、環境変数に入れておきます。
`.bash_profile`などに書いておくといいでしょう。
New Relicは1週間しか使っておらず、お作法がよくわからないので、とりあえず、`NR_API_KEY`と`NR_ACCOUNT_ID`にしました。

```sh
export NR_API_KEY=NRAK-4KCST5......
export NR_ACCOUNT_ID=1234567
```

という感じです。

## 使い方

### 基本的な使い方

grepコマンドのような雰囲気で使えます。
`logind`を含むログを検索してみます。

```sh
nrgrep logind
```

```console:結果
Mar 15 22:01:36 ns1 systemd-logind: New session c55 of user root.
Mar 15 22:01:36 ns1 systemd-logind: Removed session c55.
Mar 15 22:20:49 ns1 systemd-logind: New session 16952719 of user root.
```

おお、いい感じです。

### 期間の指定

デフォルトでは3日前から検索するようにしてありますが、期間も指定できます。

2023年3月15日 22:15:00～2023年3月15日 22:25:00の間で検索してみましょう。

```sh
nrgrep --since 20230315221500 --until 20230315222500 logind
```

```console:結果
Mar 15 22:20:49 ns1 systemd-logind: New session 16952719 of user root.
```

絞り込むことが出来ました。

秒まで書くのも面倒なので、省略して月日のみや月日時などでも検索できます。

```sh
nrgrep --since 2023031522 --until 2023031523 logind
```

のようにした場合、2023/3/15 22:00～23:00の間で検索します。

### 行数の指定

デフォルトでは全て抽出するようになっていますが`-l`オプションで取り出す行数を指定できます。

```sh
nrgrep -l 2 logind
```

### 正規表現での検索

`-e`オプションを付けることで、正規表現で検索できます。

```sh
nrgrep -e 'Started.*Getty'
```

```console:結果
Mar 15 22:08:32 ns1 systemd: Started Console Getty.
Mar 15 22:08:32 ns1 systemd: Started Getty on tty2.
Mar 15 23:08:33 ns1 systemd: Started Getty on tty2.
Mar 15 23:08:33 ns1 systemd: Started Console Getty.
```

### Attributeの表示

New Relicでは自動、または、ルールを作成することで、ログの中の有益な情報をAttributeと呼ばれるものに切り出すことができます。
このAttribute情報をログの左側に表示します。
`-a`オプションでAttribute名を指定します。
複数記述することが可能です。

`log`というキーワードで検索し、`logtype`と`timestamp`というAttributeを表示してみます。

```sh
nrgrep -a logtype -a timestamp log
```

```console:結果
newrelic-cli:1678885235732:Log installation completed
newrelic-cli:1678885236973:Done executing and validating with progress for recipe name logs-integration.
linux_messages:1678885296242:Mar 15 22:01:36 ns1 systemd-logind: New session c55 of user root.
linux_messages:1678885296257:Mar 15 22:01:36 ns1 systemd-logind: Removed session c55.
linux_messages:1678886449540:Mar 15 22:20:49 ns1 systemd-logind: New session 16952719 of user root.
```

`logtype`として`newrelic-cli`と`linux_messages`が表示されました。また、その横にtimestampが表示されています。

### Attributeで検索

Attributeで検索することも出来ます。
`-q`オプションで`Attribute名:抽出する値`という形式で指定します。
複数指定した場合はAND検索されます。

ここでは、`log`というキーワードで、`logtype`が`linux_messages`のものを検索します。

```sh
nrgrep -a logtype -a timestamp -q logtype:linux_messages log
```

```console:結果
linux_messages:1678885296242:Mar 15 22:01:36 ns1 systemd-logind: New session c55 of user root.
linux_messages:1678885296257:Mar 15 22:01:36 ns1 systemd-logind: Removed session c55.
linux_messages:1678886449540:Mar 15 22:20:49 ns1 systemd-logind: New session 16952719 of user root.
```

### 応用編

おしゃれなGUIではなくいつも通りのgrepコマンドと変わらないはずなので、パイプでつないだり今までのノウハウがそのまま生かせます。

`log`というキーワードで検索して`logtype`の種類毎に結果の行数を集計して多い順に並べてみましょう。

```sh
nrgrep -a logtype log | awk -F: '{print $1}' | sort | uniq -c | sort -nr
```

```console:結果
 69 linux_messages
 14 newrelic-cli
```

いい感じです。

## まとめ

New Relicにログを保存するのは便利なのですが、今まで通りgrepは使いたい。
そんな方向けのコマンドの紹介でした。

ソースも公開していますので、フォークして都合のいいように改造するもよし、改造したソースをプルリクしていただくのも歓迎です。

https://github.com/hirachan/newrelic-grep

それでは、楽しいログライフを。