HTTP でデータを POST するとどんどんログファイルに記録していく簡易ロガーサーバーが欲しくなったので作成しました。
目的
部屋内の気温や気圧を計測したくて RaspberryPI にセンサーを付けました。
(参照)
http://www.fumi2kick.com/komekame/archives/2331
http://www.fumi2kick.com/komekame/archives/2345
このセンサーから読み取った値をネットワーク上の別サーバーにロギングしようということになったのですが、そういった小物デバイスや定期的な観測などからのデータ蓄積という場面は意外と多いため簡単なログサーバーを作ると便利だろう思ったのが今回の発端です。
RaspberryPi は割と色々できますが、これより小さい IoT 的なデバイスでも使えるようにプロトコルはシンプルな HTTP POST とし、ネットワークさえ繋がれば色んな所からログを POST できるようにします。
自宅内の「なんちゃってIoT」な環境構築への一歩かもしれません。
動作環境
Docker Engine と docker-compose がインストールされているサーバー上で動作します。
構成
3つの Docker コンテナで構成され、これらを docker compose でlinkを指定しながら起動します。
RabbitMQ はリクエストをシリアライズするのが目的ですが、AMQP で直接ポストしたいという状況にも対応するため挟んでいます。
使い方
動作させるだけならば下記の docker-compose ファイルがあれば十分です。
docker-compose.yml と名前を付けて保存してください。
rabbitmq:
image: rabbitmq
ports:
- "5672:5672"
environment:
RABBITMQ_DEFAULT_USER: nanlog
RABBITMQ_DEFAULT_PASS: plaoSgs
nanlogapi:
image: rerofumi/nanlog-api
links:
- rabbitmq:rabbitmq
ports:
- "8080:8080"
nanlogstore:
image: rerofumi/nanlog-store
links:
- rabbitmq:rabbitmq
volumes:
- /etc/localtime:/etc/localtime:ro
- /var/log/nanlog:/store
docker-compose.yml をサーバーに置き、docker-compose pull
を実行して docker イメージを取得します。RabbitMQ は公式リポジトリのものを利用していますし、それ以外も DockerHub においてあります。
イメージ取得後
# docker-compose up -d
としてロガーを起動します。
上記 docker-compose.yml そのままだと port 8080 で待ち受けますので、http://localhost:8080/[prefix]/
に対しデータを POST してください。prefix の指定は必須です。POST した body がそのままログに記録されます。
curl でのテストコードは
$ curl -X POST -d "hoge" http://localhost:8080/test/
となります。
この場合 prefix が test ですので、/var/log/nanlog/test/ 内に YYYMMdd.log と日付が付いたファイルの中に "hoge" が記録されます。
log のフォーマットは1行毎の JSON 形式で、以下の様になっています。
{"time":"2015-12-28T15:53:38+09:00","log":"aaa"}
{"time":"2015-12-28T16:14:46+09:00","log":"bbb"}
{"time":"2015-12-28T16:22:58+09:00","log":"cccc"}
ソースコード等
以下を参照。
https://bitbucket.org/rerofumi/nanlog/
おわりに
本気でログを取ったり管理したい場合は flunetd を使ったシステムを構築したほうが良いでしょう。
そうではなくあくまで個人用途の小さいロガーとしてこういったものが部屋内にあると便利なのではないかと思います。