splunkにデータが取り込まれない時のトラブルシュートtips


# はじめに
splunkの機能の一つとして「あるデータソースから出力されたデータ(ログ)を自動で取り込む」というのがあります。
この機能を使うと、たとえば、OSのログが出力されたタイミングで、そのログをSplunkに取り込んだり、APIリクエストが返されたタイミングで、そのレスポンスをSplunkに取り込むといったようなことができます。

この機能を使うときにハマりがちなこととトラブルシュートのtipsをまとめてみました。

※補足
以下のtipsに書かれているコマンド例では`$SPLUNK_HOME`という変数を使用しています。
Splunk EnterpriseもしくはUniversalForwarderのインストールパスと読み替えてください。

## 取り込みたいデータのパスの書き方は正しいか？

Splunk EnterpriseもしくはSplunk UniversalForwarderをインストールしたサーバーに出力されたデータファイル(ログファイル)をSplunkに取り込みたい場合、`inputs.conf`という設定ファイルにパスを設定します。
※GUIで設定した場合も、最終的に`inputs.conf`に設定が記録されます。

``` inputs.confの例
[monitor:///var/log/messages]
index = hoge
sourcetype = piyo
```
``` inputs.confの例(Windowsサーバーの場合)
[monitor://C:\log\aaa.log]
index = foo
sourcetype = bar
```


### ハマりがちポイント
- パスの先頭に`//`がついていない→つけましょう
- 大文字小文字がtypoしている→`k`や`K`などの違いに注意しましょう
- パスに含まれる記号がtypoしている→`_`と`-`とかに注意しましょう
- 取り込み先インデックスに存在しないインデックスを指定している→`index=`は正しい設定を入れましょう。

※加筆
Windowsイベントログを取り込みたい場合、通常`monitor`ではなく`WinEventLog`で指定しますが、
大文字小文字が混在している書き方(キャメルケース)なので注意しましょう。

``` Windowsイベントログの取り込み設定例
[WinEventLog://Security]←"W"in"E"vent"L"ogになっている。

```

そして、Windowsイベントログのソースタイプを定義する`props.conf`では`//`を含めずに書くので注意しましょう。
※イベントログをxml形式で取り込まない場合。

``` Windowsイベントログのソースタイプを設定するprops.confの例
[WinEventLog:Security]←"Security"の前に//がない。

```




## 取り込み状況を確認するためのコマンド

Splunkには、取り込み状況や設定を確認するためのコマンドが幾つか用意されています。
取り込みが上手くいかない場合は、これらコマンドを利用してみましょう。

``` 読み込み対象ファイルを確認する.
$SPLUNK_HOME/bin/splunk list monitor
```

``` 読み込み状況を確認する.
$SPLUNK_HOME/bin/splunk list inputstatus
```

``` 設定を確認する.
$SPLUNK_HOME/bin/splunk btool inputs list
```

## ファイルパーミッションは正しいか？

Splunkでファイルを取り込むには、そのファイルに対するSplunkのプロセス起動ユーザーのパーミッションが適切に指定されている必要があります。

### ハマりがちポイント
- Splunkのプロセス起動ユーザーがnon-rootユーザーなのに、取り込みたいファイルのパーミッションがrootのみ読み取り可能になっている
- 取り込みたいファイルのディレクトリに対するパーミッションがない
- Windowsのファイル共有サーバーのパスを指定しており、そのパスに対するアクセス権限がない

## 送受信設定は正しいか？

Splunkは、あるSplunkサーバーで取り込んだデータをSplunkの転送機能を使って別のSplunkサーバーに転送することができます。たとえば、syslogサーバーにSplunk UniverasalForwarderをインストール/設定しておくことで、syslogサーバーで出力したログを別のSplunkサーバーに転送することができます。この、複数のSplunkサーバーを組み合わせた構成を分散構成と呼んだりします。
この転送機能はTCP/IPプロトコルをベースとしているので、IPやポート設定を適切に設定する必要があります。

### ハマりがちポイント
- 受信先のSplunkサーバーで受信設定をしていない
- 送信先のSplunkサーバー/ポートが間違っている
- 送信先のSplunkサーバーを名前で指定しているが、名前解決ができていない


## 送受信設定を確認するためのコマンド

以下のコマンドで送受信設定を確認することができます。

``` 受信側.
$SPLUNK_HOME/bin/splunk show listen
```

``` 転送側.
$SPLUNK_HOME/bin/splunk list forward-server
```

## ネットワークに問題はないか？

Splunkに限った話ではないですが、Splunkの通信がNW経路上の機器で遮断されている場合があります。
この場合`netstat`や`ss`,`route`コマンドなどで経路上の通信状況を確認するのが基本的なトラブルシューティングとなります。

### ハマりがちポイント
- UniversalForwarderとSplunk Enterpriseの間に設定されたFirewallが通信を遮断している
- Windowsファイアウォールなど、OSのパーソナルファイアウォールが通信を遮断している

## ファイルの中身が他のファイルと重複していないか？

例えば、「あるディレクトリに出力されたファイル全てをSplunkに取り込む」という設定がされているとします。

``` 取り込み対象をディレクトリにした例.
[monitor:///data/log/directory/]

上記ディレクトリに出力されるファイル
aaaa_20201130.csv
aaaa_20201201.csv
aaaa_20201202.csv
...

```

この時、出力されたファイルの先頭256byteが全く同じ場合、Splunkデフォルトの設定では、先頭256byteが重複したファイルが取り込まれないケースがあります。たとえば、ファイル1行目がヘッダーになっているcsvなどでこの事象が発生する可能性があります。
これは、OSのログローテーション機能などによって、あるファイルがリネームされたときに、そのファイルがSplunkに二重で取り込まれるのを防ぐための仕様とも言えます。

対処方法としては、`crcSalt=<SOURCE>`設定を入れることで、
Splunkのファイル重複判定処理をデフォルトから変更します。
デフォルト・・・ファイルの先頭256byteを重複判定の処理に使用する。
変更後・・・ファイルの先頭256byte＋ファイルのフルパスを重複判定の処理に使用する。

``` .
[monitor:///data/log/directory/]
<中略>
crcSalt = <SOURCE>
```
なお、この`crcSalt = <SOURCE>`設定を行った場合、ファイルがリネームされた場合において
リネーム後のファイルも取り込まれてしまう可能性があるので、特にログローテーションが
行われているようなディレクトリに対しては設定をおこなうべきかよく検討する必要があります。

## それでもだめなら

[Splunk answers](https://community.splunk.com/t5/Community/ct-p/en-us)
または
サポート

に聞いてみましょう。