= Fluentでログ管理 == CentOSにFluentdをインストール 下記のコマンドを叩くと、Fluentd開発元のTreasuredata謹製のFluentdがインストールされる。 {{{ $ curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sh }}} プロキシ経由でWebにアクセスする場合は、/etc/yum.confにプロキシの設定を記述する。 {{{ /etc/init.d/td-agent start }}} でFluentdのエージェントが起動。 == 使ってみる HTTP経由でログ出力、 {{{ $ curl -X POST -d 'json={"post":"message"}' http://localhost:8888/debug.post }}} fluent-catを利用してログ出力 {{{ $ echo '{"cat":"message"}' |/opt/td-agent/embedded/bin/fluent-cat --json debug.cat }}} /var/log/td-agent/td-agent.logにログが出力される。 {{{ 2015-11-07 12:53:46 +0900 debug.post: {"post":"message"} 2015-11-07 12:54:18 +0900 debug.cat: {"cat":"message"} }}} == OpenStackのログを管理してみる 例えば、こんな感じのログがあるとする。 {{{ 2014-05-21 13:01:55.215 6322 INFO nova.osapi_compute.wsgi.server [-] (6322) accepted ('192.168.66.128', 42247) 2014-05-21 13:01:55.968 6322 DEBUG nova.api.openstack.wsgi [-] No Content-Type provided in request get_body /usr/lib/python2.7/dist-packages/nova/api/openstack/wsgi.py:835 2014-05-21 13:01:55.998 6322 DEBUG nova.api.openstack.wsgi [-] Calling method > _process_stack /usr/lib/python2.7/dist-packages/nova/api/openstack/wsgi.py:962 2014-05-21 13:01:56.286 6322 INFO nova.osapi_compute.wsgi.server [-] 192.168.66.128 "GET /v237da0ad900aa4119bc743d59975e1bce/images/detail HTTP/1.1" status: 300 len: 486 time: 0.6088369 }}} Fluentdは、正規表現を利用してログを解析し、タグ(属性)をつけて保存することができる。 {{{ type tail path /var/log/nova/nova-api.log pos_file /var/log/td-agent/nova-api.log.pos tag nova-api.log format /^(?\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}.\d{3} \d{4}) (?[^ ]*) (?[^ ]*) \[(?[^ ]*)] (?.*)$/ type file path /var/log/td-agent/openstack.log }}} /var/log/td-agent/openstack.log.xxx ファイルにログが書き出されるようになる。 スタックトレースなど、複数行に渡るログを正しく取得するには、format multilineを利用する。 {{{ type tail path /var/log/nova/nova-api.log pos_file /var/log/td-agent/nova-api.log.pos tag nova-api.log format multiline format_firstline /\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}.\d{3} \d{4}/ format1 /^(?\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}.\d{3} \d{4}) (?[^ ]*) (?[^ ]*) \[(?[^ ]*)] (?.*)/ }}} 他のマシンにログを転送する場合は、fowardを設定する。 {{{ type forward host logserver }}} 転送されたログサーバで、matchルールを記述すれば、ログに出力できる。 == MongoDBでログを管理 MongoDBでログを管理すると、クエリーなどで検索できるので使いやすくなる。 MongoDBをインストールする。 {{{ # yum install epel-release # yum install mongodb mongodb-server # systemctl start mongod.service }}} ログ用のデータベース作成 {{{ # mongo openstack-log MongoDB shell version: 2.6.11 connecting to: openstack-log > use openstack-log switched to db openstack-log }}} Fluentdの設定 {{{ type mongo database openstack-log collection log host localhost port 27017 flush_interval 10s }}} ログの確認 {{{ # mongo openstack-log MongoDB shell version: 2.6.11 connecting to: openstack-log > show collections; log system.indexes > db.log.find(); { "_id" : ObjectId("563de070e138230994000001"), "date" : "2016-05-21 13:01:55.215 6322", "level" : "INFO", "class" : "nova-api.osapi_compute.wsgi.server", "tag" : "-", "message" : "(6322) accepted ('192.168.66.128', 42247)", "time" : ISODate("2015-11-07T07:34:56Z") } .... }}} === Fluentdでログを検索しよう levelがERRORのログのみを出力 {{{ > db.log.find({level: "ERROR"}) ; }}} ERRORとWARNのログを出力。$inを使う。 {{{ > db.log.find({level: {$in: ["ERROR","WARN"]}}); }}} 時間で絞り込み検索$gt(以上:grater than),$lt(以下:lesser than)を使う。 {{{ > db.log.find({date: {$gt: "2015-05-21 13:00",$lt: "2016-05-21 13:00"}}) ; }}} 複数の条件のコンビネーション(and条件)は、カンマで区切ってならべる。 {{{ > db.log.find({date: {$gt: "2015-05-21 13:00",$lt: "2016-05-21 13:00"},level: "INFO"}) ; }}} ログから文字列にマッチするメッセージを検索する。例えば、インスタンスIDなどを指定する例。 {{{ > db.log.find({"message":/940f3b2f-bd74-45ad-bee7-eb0a7318aa84/}); }}}