なからなLife

geekに憧れと敬意を抱きながら、SE、ITコンサル、商品企画、事業企画、管理会計、総務・情シス、再び受託でDB屋さんと流浪する人のブログです。

CentOS 6.9の上でapache-loggen使いたくてゴタゴタした。

きっかけ

とある製品の検証をするにあたり、ある程度リアリティのある大量データがほしいなと思ったところから。


apache-loggenは過去にElasticsearchの勉強しているときにちょっと触ったことがあって、ランダムなデータが一定間隔で出力できて、それでいてちゃんとApacheしてるので使い手があるなと。

LogstashならFilter構文簡単だし、正規表現が必要なツールで読むにしても、正規表現サンプル結構転がってるし。
GeoIPとぶつけてあげれば、いい感じに地理情報系のサンプルデータにも転用できるし。

で、久々に環境立て直そうとしたら、apache-loggenを動かす大前提のruby周りでハマったので、いまうまくいくやり方を残しておこう、って話です。

OSインストール

CentOS6.xをMinimal構成でインストール。(VirtualBoxの上にCentOS 6.9)

yum -y update
yum -y groupinstall 'Development tools'
yum -y install wget

rubyインストール

yumrubyを入れると退役宣言されている1.8.7が入ってしまいます。

apache-loggenのReadmeには

履歴
0.0.5 Limitで指定した値よりも1つレコードが多く出力されるのを修正。
0.0.4 Ruby-1.8.7でも動くようにした。
0.0.3 Rate=1くらいの低速度の場合、Flushが走らないので明示的にFlushするようにした。
0.0.2 RubyGemsに登録。コマンドを用意した。クラスの再利用ができるようにした。
0.0.1 はじめてのリリース
https://github.com/tamtam180/apache_log_gen

って書いてあったので、yumならラクチンでいいや、って思って進めたら、途中で詰まりました。



なので、1.8.7でどうにか動かす方法を探るのではなくて、2.0以上を最初から入れておく方法を取りました。

今時Rubyはrbenvでインストールするのが主流のようなので、
CentOSにrbenv, Rubyをインストールする - Qiita
に倣ってCentOS6.9にインストールします。

CentOS7(RHEL7系互換)だと、Yumで入れてもRuby2系が入るらしいです。
未だ、ちょっとした用事だと慣れた6系を使おうとしてしまう人です。

# Gitインストール
sudo yum -y install git

# Gitバージョン確認
git --version

# rbenvインストール
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv

# renvディレクトリ確認
ls -d ~/.rbenv

# ruby-buildインストール
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

# ruby-buildディレクトリ確認
ls -d ~/.rbenv/plugins/ruby-build

#  .bash_profile設定
echo '# rbenv' >> ~/.bash_profile
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile

# .bash_profile確認
cat ~/.bash_profile

# 反映
exec $SHELL --login

# rubyのインストールに必要なパッケージをインストール
sudo yum -y install bzip2 gcc openssl-devel readline-devel zlib-devel

# インストールしたパッケージのバージョン確認
bzip2 --version
gcc --version
yum list installed | grep openssl-devel
yum list installed | grep readline-devel
yum list installed | grep zlib-devel

# rbenvバージョン確認
rbenv --version

# インストールできるrubyのバージョンを確認
rbenv install --list

# rubyインストール
rbenv install 2.4.3

# 切り替え可能なrubyのバージョンを確認
rbenv versions

# rubyのバージョンを切り替え
rbenv global 2.4.3

# rubyのバージョンが切り替わったことを確認
ruby -v
はまったところ

この日の最新の2.5.0を入れたらエラーが出ました。

ちょっとググったところ、
CentOS6.9 に ruby の環境を作って、Ruby on Rails のプロジェクトを作る - Qiita
において

調べてみると、どうやら CentOS6.9 で rbenv の rbenv-build を使って ruby 2.5.0 をビルドしようとすると出るrubyのエラー……なのかな……?ruby にチケット立ってたんだけど。。。
参考:https://bugs.ruby-lang.org/issues/14234

バージョン下げたらうまく行きました。

と同じエラーに引っかかったみたいなので、バージョン1つさげて2.4.3を入れました。




これで、gemもインストールされているので、appache-loggenもインストールできる状態になりました。

appache-loggenのインストール

gem install apache-loggen

これだけ。

ログを出力してみる。

GitHub - tamtam180/apache_log_gen: generate dummy apache log.

にあるものを動かしてみる。

# 毎秒100レコードの速度でファイル「abc.log」に出力
apache-loggen --rate=100 abc.log

適当に強制終了させて、出来上がったファイルサイズと中身を見て確認すればOK。

「--rate」は秒間何行出力するか、ってパラメータのはずなんですが、手元の環境ではまったくその通りにならない&明確に何倍のペースとかいう傾向も掴めなかったので、参考程度に使おうと思います。
今回はそこまで厳密な要件もないし。




オマケ:LogstashでApacheログをCSVに変換する

Apacheのログって、そのままだと空白で区切られたり、区切りたくない所で空白が入ってたり(UserAgentあたり)するので、単純にCSV化するの辛いです。

で、Logstashに「Csv output plugin」ってヤツがいるので、こいつを使って変換してみます。
なお、InputでApacheのログファイルを指定して、読み取り内容のフォーマットを解釈させるところは、LogstashのFilterで
match => { "message" => "%{COMBINEDAPACHELOG}" }
って書いてあげるだけで解釈してくれるので、設定自体はかなりラクです。


セットアップは過去のブログ
Logstashを使ってみる - Kibanaを立ててみた - なからなLife
に遡って完了しているものとして、使用するconfファイルは、以下のようになります。

input {
    file {
        path => "入力元パス・ファイル名"
        start_position => "beginning"
        type => "apache-log"
    }
}
filter {
    if [type] == "apache-log" {
        grok {
            match => { "message" => "%{COMBINEDAPACHELOG}"}
        }
        date {
            match => ["timestamp", "dd/MMM/YYYY:HH:mm:ss Z"]
            locale => en
        }
    }
}
output {
    if [type] == "apache-log" {
        csv {
            fields => ["clientip","ident","auth","timestamp","verb","request","httpversion","response","bytes","referrer","agent"]
            path => "出力先のパス・ファイル名"
        }
    }
}

このファイルを作成したら

logstash -f 上記の設定ファイルの場所

で動きます。(logstashへのパスは通してあるものとする)

正直、ちょっと重い(遅い)感じがする。いきなり1000万件のデータ読み込ませたからかもしれないけど、何か他の方法の方が速いのかもね。


とはいえ、これでRDBMSへのインポート(あるいは、少量ならexcelへのインポート)も、だいぶラクになったはず。


本当は直接RDBMSのテーブルに投入したいところでもあるのですが、LogstashのOutputプラグインJDBCが存在していないので、
あとで、Embulkでテーブルに投入も試してみたいです。



CSV出力ではなく、Elasticsearch+Kibanaに対してLogstash/Fluentdで流し込む例については、色々な人がブログエントリあげていますが、やはりElasticの大谷さんのやつがわかりやすいですね。
Logstashを利用したApacheアクセスログのインポート - @johtaniの日記 2nd
apache-loggen + fluentd + elasticsearch + kibana = ログ検索デモ - @johtaniの日記 2nd


そんなわけで、とりあえずやりたいこと=apache-loggenでapacheのダミーログデータ大量生成ができる環境になりました。