LogstashでJDBC経由でDBへ出力する方法

## 概要

現在関わっている案件で、監査証跡(Audit Trail)をDBで管理したいという話があるのですが、
諸事情によりビジネスロジックのトランザクションで投入するのが厳しいので、一度ファイルログに
出力して、ファイルログをLogstash経由でDBに入れてみようと思い、検証してみたときのログです。

## 環境
OS: Mac OS X Yosemite 10.10.3
Java: 1.8.0_25
SQLite: 3.8.5

## インストール
Macなので、とりあえずbrewでインストールします。

```
$ brew install logstash
==> Downloading https://download.elasticsearch.org/logstash/logstash/logstash-1.5.0.tar.gz
######################################################################## 100.0%
==> Caveats
Logstash 1.5 emits an unhelpful error if you try to start it without config.
Please read the getting started guide located at:
https://www.elastic.co/guide/en/logstash/current/getting-started-with-logstash.html

==> Summary
/usr/local/Cellar/logstash/1.5.0: 8865 files, 151M, built in 83 seconds
```

無事インストールが終わったので、Logstashのホームディレクトリへ。

```
$ cd /usr/local/Cellar/logstash/1.5.o
```

## Hello Worldしてみる
```
$ bin/logstash -e 'input { stdin { } } output { stdout {} }'

hogehoge
2015-06-29T13:56:40.019Z HOSTNAME hogehoge
```
問題なさそうです。

## logstash-output-jdbcのインストール
標準プラグインではDBへのOutput Pluginが見当たらず・・・。
下記のプラグインを入れてみました。

theangryangel/logstash-output-jdbc
https://github.com/theangryangel/logstash-output-jdbc

```
$ libexec/bin/plugin install logstash-output-jdbc

Validating logstash-output-jdbc
Installing logstash-output-jdbc
Installation successful
```

JDBCドライバを配置するフォルダを作成。

```
$ mkdir -p libexec/vendor/jar/jdbc/
```

とりあえず、お手軽にSQLite3へ出力してみたかったので、
下記からsqlite-jdbcドライバを入手して上記のフォルダに配置しました。
https://bitbucket.org/xerial/sqlite-jdbc/downloads/sqlite-jdbc-3.8.10.1.jar


## SQLite3へ出力

出力用のDBを作成します。

```
$ echo "CREATE table log (host text, timestamp datetime, message text);" | sqlite3 test.db
```


INPUTとなるログファイルを作成します。今回はCSV形式にしてみました。

```access.log
2015-06-29 13:56:00.000,HOSTNAME,This is first line.
2015-06-29 13:57:00.000,HOSTNAME,This is second line.
2015-06-29 13:58:00.000,HOSTNAME,This is third line.
```

設定ファイルを作成します。

```logstash.conf
input
{
    stdin { }
}
filter {
	csv {
        columns => ["timestamp", "host", "message"]
    }
}
output {
    stdout { }

    jdbc {
        driver_class => 'org.sqlite.JDBC'
        connection_string => 'jdbc:sqlite:test.db'
        statement => [ "INSERT INTO log (host, timestamp, message) VALUES(?, ?, ?)", "host", "timestamp", "message" ]
    }
}
```

いよいよ実行してます。

```
$ cat access.log | bin/logstash -f logstash.conf

2015-06-29T15:04:53.435Z HOSTNAME This is first line.
2015-06-29T15:04:53.437Z HOSTNAME This is second line.
2015-06-29T15:04:53.437Z HOSTNAME This is third line.
Logstash startup completed
Logstash shutdown completed
```

DBに入っているか確認します。

```
$ sqlite3 test.db

SQLite version 3.8.5 2014-08-15 22:37:57
Enter ".help" for usage hints.
sqlite> select * from log;
HOSTNAME|2015-06-29 13:56:00.000|This is first line.
HOSTNAME|2015-06-29 13:57:00.000|This is second line.
HOSTNAME|2015-06-29 13:58:00.000|This is third line.
```

ばっちりですね:thumbsup: 

## 終わりに
LogstashでDBに出力する情報が日本語では見つからなかったので、若干不安がありましたが、Logstashをはじめて扱う私でも、ここまでさくっと試すことができました。

Logstash自体がJRuby同梱でJVM上で動きますが、Rubyで書かれています。
今回利用したプラグインも、Rubyで実装されているシンプルなもので、最悪何かあっても自分でどうにかできるという安心感があるのはよいところです。

まぁ仕事のほうはOracleなので、再度ちゃんと検証しなきゃですが、LogstashでDBへ出力する際のチュートリアルとして参考になれば幸いです。