質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

Fluentd

Fluentdは、オープンソースのログ収集ツールです。ログの収集方法、ログの記録先などのログデータ処理を柔軟にカスタマイズでき、インプットおよびアウトプットが全てプラグインとして実装されています。

Q&A

2回答

4827閲覧

ログ収集でGETのqueryパラメータをjsonにパースする方法がわからない

退会済みユーザー

退会済みユーザー

総合スコア0

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

Fluentd

Fluentdは、オープンソースのログ収集ツールです。ログの収集方法、ログの記録先などのログデータ処理を柔軟にカスタマイズでき、インプットおよびアウトプットが全てプラグインとして実装されています。

0グッド

0クリップ

投稿2015/10/23 02:43

apacheのアクセスログをfluentdで収集して、s3に保存しRedShiftに蓄積したいのですが、GETのクエリ文字列部分の取り出し方がわからず苦戦しております。(jsonにパースしたい)

例)
//hogehoge.co.jp/test.php?test_id=111&param=hoge

apacheのLogFormatで%qを指定し、"?test_id=111&param=hoge"までは取得できています。
これを、{"test_id:111","param":"hoge"}のjsonの形にパースしたいのですが、やり方がわかりません。。。

どなたかご教示いただけますと幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

out_exec_filterプラグインを使用すれば、実現できそうです。
http://docs.fluentd.org/articles/out_exec_filter

・NIA様のご回答のようにクエリ文字列をJSON形式に変換するスクリプトを作成し、
・それをout_exec_filterで呼び出し、
・スクリプトの出力を再びfluentdで受け取り、s3に保存する、

という手順です。

以下のリンクが参考になるかと思います。
http://studio3104.hatenablog.com/entry/20120619/1340069545

ところで、クエリ文字列をパースしてからs3に保存したい理由は、何でしょうか?

これは私見ですが、ログを集約するタイミングでは、あまり複雑な処理は行なわない方が良いように思います。

上の参考リンクでも
「out_exec_filter自体の実行コストが安くない?」
と言及していますように、fluentdが集約対象のサービスの足を引っ張ったり、
ログを取りこぼす原因になる可能性があると思われるためです。

加えて、ログのフォーマットを特定の目的にカスタマイズしすぎると、
後で別の目的に流用したくなった際に、再度、パースしなければならなくなるかも知れません。

可能であれば、クエリ文字列は生のままで保存し、
s3またはRedShiftから取り出す際にJSON形式にパースすることを検討されてはいかがでしょうか?

見当はずれな意見でしたら、ご容赦願います。

投稿2015/10/23 14:51

KiyoshiMotoki

総合スコア4791

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

言語が分からないのでPHPで参考程度に記載します。

PHP

1<?php 2$url = 'http://test.jp/index?test_id=111&param=hoge'; 3 4$param = parse_url($url); 5 6echo "<pre>"; 7var_dump($param['query']); 8echo "</pre>"; 9 10$param = split("&",$param['query']); 11$params = array(); 12 13foreach($param as $val) 14{ 15 $tmp = split("=",$val); 16 $params[$tmp[0]] = $tmp[1]; 17} 18 19echo "<pre>"; 20var_dump($params); 21echo "</pre>";

後はJSONの型に整えるだけかと思います。

投稿2015/10/23 07:13

NIA

総合スコア181

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問