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インストール
yumでrubyを入れると退役宣言されている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のダミーログデータ大量生成ができる環境になりました。
プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで (Software Design plusシリーズ)
- 作者: 伊藤淳一
- 出版社/メーカー: 技術評論社
- 発売日: 2017/11/25
- メディア: 大型本
- この商品を含むブログを見る