タグ「Perl」が付けられているもの
そこで無い頭を使ってちょっとだけ考えたのですが、Encodeとjcodeに被さる形でラッパーを書いて、それを利用すれば良いのでは無いかという案。
ただ、自分の手元には5.6環境なんて残って無くて、テスト環境作ったりする必要もありそうですし、面倒くさいです。
誰か作ってないかなぁ。。
日本語の扱いについては慣例的にjcode.plに頼りきりだったのですが、Encodeモジュールとやらを使ってみようかと。ところが、こいつがなかなか曲者で、jcode.plに慣れていると大変かも知れません。
今後はEncodeモジュールにするべきでしょうし、jcode.plが不要になるということもあって、少しだけ使ってみました。
ApacheをPerlスクリプト経由でデータベースに吐き出す方法だが
パフォーマンスの問題が大丈夫か?という不安があった。
実際やってみると、毎回起動している訳ではないためある程度
大丈夫そうという事が判った。
http://httpd.apache.org/docs/2.2/ja/logs.html#piped
Apacheのドキュメントにあるのだが、
>Apache はパイプ経由のログ用のプロセスをサーバの起動時に実行し、 サーバの実行中にそのプログラムがクラッシュしたときはそれを再び 実行します。(この最後の機能がこの技術が「信頼性のあるパイプ経由のロギング」 と呼ばれている理由です。)
という記述があり、Perlを利用してもパフォーマンス的には問題ないだろうと思う。
最初は行毎にスクリプトが呼び出されるのかと思い、
my line = <>
と記述していたが上手くいかず上記のドキュメントを発見して
while (my $line = <>) {
とすることでログを取得することが出来た。
別の方法としてmod_log_sqlを利用する方法もあるが、DBとしてMySQLしかサポートしていないようである。Perl+DBIで書き出す場合はDBIがサポートする他のDBを利用できることが利点となる。
勉強も兼ねてApacheのログをデータベースに出力してみる。
何で?わざわざDBに?という事だが、
メリット)
・複数Webサーバのログを集約することが出来る
・ログから条件で抜き出す事が容易かつ高速
デメリット)
・DBのメンテナンスが必要
・ログの記録に関してはパフォーマンス的にどうか?
実際に出力する方法としては
httpd.confのCustomLog行でパイプが使える(rotatelogもパイプ使いますよね・・・)ので、「標準入力から入力されたアクセスログをデータベースに書き出す」プログラムがあれば実現可能となる。
CustomLog "|/usr/local/bin/PROGRAM" common
勉強も兼ねてPerlで書いてみた。
PerlからDBを操作する方法としてはDBIを利用するのが簡単そうである。
テストで書いてみたので、置いてみる。テストで作ってみたPerlソースファイル
多分自分が一番見るんだけど。
標準入力(<>)から入力された行を区切って項目別に分けて、データを準備して、それをSQL文(INSERT)に渡すだけである。