いますぐ実践! Linuxシステム管理

いますぐ実践! Linux システム管理 / Vol.254 / 読者数:2537名

こんばんは、うすだです。

大変申し訳ございません、またまた1回すっぽかしてしまいました。

土日にもろもろの調整をする、ということが常態化しており、 なにかあるとなにかが押し出されてできなくなる、という感じで生きております。

このところ、なれない仕事でいろいろ押し出され気味です。 栗だけは意地で描いていますが…。(技術者としては間違っている気もしますが…。)

まあ、春になったら一段落しているだろうと夢見つつ、 できるだけ早めにアレコレするようにしたいと思います。

根本的な問題には目をつむりつつ、今回もはりきってまいります。

今回のお題 - fluentd を使ってみる / ジャスティス・フォーエバー

というわけで、1ヶ月のブランクがございますが、細かいことは気にせずに、 前回ご紹介した fluentd の続きをご覧ください。

Vol.253 - fluentd を使ってみる
http://www.usupi.org/sysad/253.html

あ、今回お送りする内容は、以下の3点です。

  • 他のサービスのログファイルから読み込む
  • 外部プログラムの出力を読み込む
  • MongoDB に記録する

最後の MongoDB は、MongoDB を知らなくてもなんとかなります。

他のサービスのログファイルから読み込む

tailプラグイン(in_tail)を使うと、 他のサービスのログファイルを読み込んで処理することができます。 Apache のアクセスログを読み込む設定例を以下に示します。

<source>
  type tail
  path /var/log/apache2/access.log
  tag apache2.access
  format apache2
  pos_file /var/log/td-agent/apache2_access.log.pos
</source>

typeパラメータでは tail を指定します。
pathパラメータでは、読み込むログファイルのパスを指定します。
tagパラメータでは、ログに付けるタグ名を指定します。
formatパラメータでは、読み込むログファイルのフォーマットを指定するのですが、 メジャーなものなら名前を指定するだけで済みます。現時点で利用可能なものは、 「apache2」「nginx」「syslog」「csv」「json」…などなどです。あるいは、 正規表現できっちり指定もできます。
pos_fileパラメータでは、どこまで処理したか位置を記録するファイルを指定します。 必須ではありませんが、「強く推奨」とあります。

いちおう、出力の設定例も以下に示します。ファイルに出力します。

<match apache2.access>
  type file
  path /var/log/td-agent/apache2_access.log
  flush_interval 10s
</match>

これらを /etc/td-agent/td-agent.conf に追記して、 サービスを再起動すれば…と言いたいところですが、 ひとつ確認すべきことがあります。
環境によっては、td-agent さんがアクセスログを参照できない可能性があります。 たとえば、

  $ ls -l /var/log/apache2/access.log
  -rw-r----- 1 root adm 4791  2月  2 16:07 /var/log/apache2/access.log

これだと、root か adm グループの人しか読めません。ですが、

  $ id td-agent
  uid=130(td-agent) gid=142(td-agent) groups=142(td-agent)

td-agent さんは、そもそも root ではありませんし、 adm グループにも入っていません。そこで、adm グループに加えます。
(お試し環境ではいいですが、そうでないなら、加えていいかどうかを、 管理者間で議論してからそうしてください。)

  $ sudo usermod -G adm td-agent
  $ id td-agent
  uid=130(td-agent) gid=142(td-agent) groups=142(td-agent),4(adm)

これで読めるようになりましたので、td-agentサービスを再起動します。

  # service td-agent restart
  (もしくは一般ユーザで sudo service td-agent restart)

Webサーバにアクセスして10秒ほど待つと、ログファイルができている…はずです。

  $ cat /var/log/td-agent/apache2_access.log.20140202_0.log 
  2014-02-02T16:07:23+09:00 apache2.access {"host":"10.0.1.1",\
  "user":null,"method":"GET","path":"/","code":200,"size":6989,\
  "referer":"...中略...}
  ...後略...

td-agent だけに、ちゃんとJSON形式に変換されています。
ちなみに、pos_file の中身はこんな感じです。

  $ cat /var/log/td-agent/apache2_access.log.pos 
  /var/log/apache2/access.log  00000000000012b7  010e4b84

左から、パス、ファイルの位置、iノード番号、と思われます。

  $ echo "ibase=16;12B7" | bc
  4791  (サイズは、前述の ls -l の結果でご確認ください)
  $ echo "ibase=16;10E4B84" | bc
  11714052
  $ ls -i /var/log/apache2/access.log
  17714052 /var/log/apache2/access.log

さらにちなみに、syslogの場合は、もとがこういうのだとすると、

  Feb  2 16:30:14 foo sSMTP[28628]: Creating SSL connection to host
  Feb  2 16:30:15 foo sSMTP[28628]: SSL connection using ...

こんな出力になります。

  2014-02-02T16:30:14+09:00 syslog.mail {"host":"foo","ident":\
  "sSMTP","pid":"28628","message":"Creating SSL connection to host"}
  2014-02-02T16:30:15+09:00 syslog.mail {"host":"foo","ident":\
  "sSMTP","pid":"28628","message":"SSL connection using ..."}

外部プログラムの出力を読み込む

前回は出力に外部プログラムを呼び出したりしましたが、 外部プログラムの出力結果を入力とすることもできます。 そうするには exec プラグイン(in_exec)を使います。 ロードアベレージの取得例を以下に示します。

<source>
  type exec
  command awk '{printf "%s\t%s\t%s\n", $1, $2, $3}' /proc/loadavg
  format tsv
  keys load1,load5,load15
  tag loadavg
  run_interval 1m
</source>
typeパラメータでは exec を指定します。
commandパラメータでは、実行するコマンドを指定します。
formatパラメータでは、外部プログラムが出力する形式を指定します。
デフォルトは「tsv」ですが、「json」なども指定できます。
(TSV(Tab Separated Values)とは、タブで区切られた形式のことです。)

keysパラメータでは、それぞれのデータの名前(キー名)を指定します。
ロードアベレージは3つあるので、3つ指定しています。
tagパラメータでは、ログにつけるタグ名を指定します。
run_intervalパラメータでは、実行する間隔を指定します。

ちなみに、指定したコマンドを実行すると、こうなります。 ちゃんとタブで区切られた出力になっています。

  $ awk '{printf "%s\t%s\t%s\n", $1, $2, $3}' /proc/loadavg
  0.50   0.41   0.40

出力の設定は割愛します。

先ほどと同様、上記設定を追加して、td-agentサービスを再起動すると、 たとえばファイルに書き出した場合、以下のような出力が得られます。
(run_intervalの間隔ごとに、1行増えていきます。)

  2014-02-02T17:15:19+09:00 loadavg {"load1":"0.51","load5":"0.32",\
  "load15":"0.37","time":1391328919}

MongoDB に記録する

mongoプラグイン(output_mongo)を使うと、 「MongoDB」というNoSQLな方に出力することもできます。

MongoDBをご存じないけれど試したいという方のため、 インストール方法を超特急で説明します。環境は Ubuntu です。

  $ sudo apt-get install mongodb-clients mongodb-server

…以上です。それでは、設定例を以下に示します。

<match mongo.**>
  type mongo
  host localhost
  port 27017
  database td-agent
  collection test
  capped
  capped_size 128m
  flush_interval 10s
</match>

typeパラメータでは mongo を指定します。
host と port パラメータでは、接続先のホストとポートを指定します。
database と collection パラメータでは、 データベースとコレクションを指定します。
tag_mapped パラメータを指定した場合、コレクション名にタグ名を使うため、 collectionの指定は不要です。
capped および capped_size パラメータ(とサイズ)を指定すると、 固定のサイズのコレクション(cappedコレクション)にできます。 サイズが上限に達すると、古いデータが上書きされて消えます。

上記設定を追加して、td-agent サービスを再起動しましたら、 たとえば以下のようにして確認できます。

  $ echo '{"test":"mongo test."}' | \
  /usr/lib/fluent/ruby/bin/fluent-cat mongo.test
  $ mongo
  > show dbs
  local (empty)
  td-agent 0.265625GB
  ...中略...
  > use td-agent
  > show collections
  system.indexes
  test
  > db.test.find()
  { "_id" : ObjectId("あいでぃー"), "test" : "mongo test.", "time" :\
  ISODate("2014-02-02T06:14:29Z") }

td-agent データベースの test コレクションを覗くと、 記録されていることがわかります。

 

たとえば、前述のロードアベレージを、MongoDB に出力などさせて、 以下のようにCSVファイルとして吐き出させると、 グラフ化など行えるのではないかと思います。

  $ mongoexport -d td-agent -c loadavg --csv -f load1,load5,load15 |\
  tr -d \"
  load1,load5,load15
  0.26,0.36,0.39
  0.28,0.36,0.39
  0.34,0.37,0.39
  ...後略...

…いや、ほんとは、リアルタイムにグラフ化などすれば格好よく終われたのですが、 スキルも時間もありませんので、割愛させていただきます。
(…いや、できてないので、割愛とも言わないですね。ごめんなさい。)

おわりに

以上、fluentd の続きをご紹介しました。

標準で使えるプラグインがそもそも豊富なのですが、それ以外にも、 大量のプラグインが公開されています。

Fluentd plugins
http://fluentd.org/plugin/

オールドタイプなわたくしとしましては、MySQL に吐かせたりとかしたいので、 試してみたいと思います。みなさまも、イロイロお試しください。

それにしても、キックアスの続編、楽しみですね。(違)

宿題の答え

前回の宿題は、

  ある fluentd の出力を、別の fluentd へ転送してみましょう。

でした。

送り側も受け側も、forwardプラグインを設定すれば、簡単にできます。
まずは、送り側の設定例です。

<match forward.*>
  type forward
  <server>
    host 192.168.1.1
  </server>
</match>

typeパラメータでforwardプラグイン(out_forward)を指定しています。
また、「server」ディレクティブで、送信先のサーバを指定します。 最低必要なのが「host」パラメータで、 送信先サーバのホスト名かIPアドレスを指定します。

受け側は、forwardプラグイン(in_forward)の設定があればOKです。
ファイルに記録する設定の例を、以下に示します。

<source>
  type forward
</source>
<match forward.*>
  type file
  path /var/log/td-agent/forward.log
  flush_interval 10s
</match>

双方のtd-agentをrestart(あるいはreload)して、送り側のマシンから、 fluent-cat コマンドで書き込んでみます。

  $ echo '{"test":"forward test."}' | \
  /usr/lib/fluent/ruby/bin/fluent-cat forward.test

しばらくすると、受け側に届きます。

  $ ls /var/log/td-agent/forward.log*
  /var/log/td-agent/forward.log.20140201_0.log
  $ cat /var/log/td-agent/forward.log.20140201_0.log
  2014-02-01T23:04:11+09:00 forward.test {"test":"forward test."}

ちなみに、serverディレクティブは、複数指定できます。
下記のように、192.168.1.1 と 192.168.1.2 を設定すると、 どちらかへ均等に割り振られます。「weight」パラメータを使って、 均等でない配分にすることもできます。

<match forward.*>
  type forward
  <server>
    host 192.168.1.1
  </server>
  <server>
    host 192.168.1.2
  </server>
</match>

いずれかに割り振るのではなく、複数のサーバにすべて送りたい場合は、 「copy」プラグインを使います。 「store」ディレクティブを使って出力先を指定します。 書式は match ディレクティブと同じです。

すべてに割り振る版の設定は、以下のようになります。

<match forward.*>
  type copy
  <store>
    type forward
    <server>
      host 192.168.1.1
    </server>
  </store>
  <store>
    type forward
    <server>
      host 192.168.1.2
    </server>
  </store>
</match>

今回の宿題

今回の宿題は、

  Fluentd で、特定のログに絞ったりなど、フィルター的なことができる
  かどうか、試してみましょう。

です。

…はい、まったく未確認のまま、宿題にしております。
無理だとしても、 なにかしらフィルター的なことはできるんじゃないかと思っております。 余力のある貴兄は、調べてみてください。

あとがき

大学で研究室に配属され、全世界の方々とメールでやり取りできる環境に出会ったのが、 1991年のことでした。たぶん、当時は UUCP で JUNET と接続していたと思いますので、 インターネットにつながっている、という感じではなかったかもしれません。

それから社会人になり、会社がインターネットと接続したのが、1994年。 そのときはじめて、 NCSA Mosaic というウェブブラウザでWWWを閲覧するという経験をしました。

それから、なんやかんやで、もう20年になります。

1990年前半は、メールやネットニュースが主流でしたが、徐々に、 WWWが幅を利かせていき、掲示板や検索エンジン、携帯での利用、 SNSやブログなどなど…と、サービスはめまぐるしく変化し多様化してきました。
(WWWの初期のころは、Gopher なんていう対抗馬もありましたね。)

そのなかで、メールだけは根強く&力強く残っていますが、最近ですと、 facebook でしか連絡が取れない人がいたりして、 メール以外の選択肢も増えつつあります。

というわけで、今までほぼ変わらずやってきましたが、 配信形態や内容が今の時代にあっているのか、求められているのか、 他に自分を活かす分野や場はないのか、などなど、いい加減ちゃんと考えよう、 と思いはじめております。

すぐやめるつもりも、がらっと全然違うことに変えていくつもりも、 今のところはありません。ですが、 今までのやり方にしがみついて変わらないでいることがリスクだということは、 強く意識したいと思います。

こうしたらいいのではとか、こういうのがいいとか、もしありましたら、 ご連絡いただけますと幸いです。おおいに参考にさせていただきます。

 

とか言いながら、少なくとも次回は変わらず発行する予定です。
ほんとに変わる気があるの? と、のっけから、自分でも心配になってきています…。 (いやいや変わらねば。)

 

今回も、ここまで読んでいただき、誠にありがとうございました。
次回は、2月16日(日) の未明にお会いしましょう!

 

「いますぐ実践! Linux システム管理」の解除は、以下からできます。
http://www.usupi.org/sysad/ (まぐまぐ ID:149633)

バックナンバーは、こちらにほぼ全部そろっています。
http://www.usupi.org/sysad/backno.html

「栗日記」- そろそろ本気出す。と言ってみたい。
http://www.usupi.org/kuri/ (まぐまぐ ID:126454)
http://usupi.seesaa.net/ (栗日記ブログ)
http://usupi.org/k/ (モバイル栗日記)
http://twitter.com/kuriking/ (栗つぶやき)
http://facebook.com/kuriking3 (栗顔本)


[バックナンバーのトップへ] [Linux システム管理のトップへ]

トップ

バックナンバー
    [日付順] [目的別]

プロフィール

▼ リンク

独学Linux
Linuxデスクトップ環境に関する情報が満載です。 メルマガもありますよ。
Server World
CentOS 6をサーバとしたときの設定例が、これでもかというくらいたくさん載っています。 CentOS以外のディストリビューション(Fedora, Ubuntu)も充実しています。
LINUXで自宅サーバーを構築・導入(Fedora9)
Fedora9のインストールの仕方から管理方法まで、詳しく載っています。 SearchManには情報がもりだくさんです。
マロンくん.NET
〜サーバ管理者への道〜
Linuxをサーバとして使用するための、いろいろな設定方法が載っています。 マロンくんもかわいいです。 なんといっても、マロンくんという名前がいいですね!!
日経Linux
今や数少なくなってしまったLinuxの雑誌。ニュースやガイドもあります。
Linux Square − @IT
@ITが提供する、Linux の情報が満載。 載っていない設定方法はないんじゃないでしょうか。
gihyo.jp…技術評論社
Linuxに限らず様々な技術情報が満載のサイト。 SoftwareDesign誌も、 ソフトウェア技術者は必見です。
SourceForge.JP Magazine
Linux に限らず、オープンソース関連の記事が網羅されています。
ITmediaエンタープライズ:Linux Tips 一覧
Tips というより FAQ 集でしょうか。わからないことがあれば覗きましょう。
IBM developerWorks : Linux
開発者向けですが、勉強になりますよ。
Yahoo!ニュース - Linux
Yahoo!のLinuxに関するニュース一覧です。
栗日記
システム管理とかと全然関係ありませんが、毎日栗の絵を描いています。
システム管理につかれちゃったとき、癒されたいときに、ご覧ください。:-)
WEB RANKING - PC関連
ランキングに参加してみました。押してやってください。

▼ 作ってみました

Add to Google

▼ せんでん




▼ 最近読んだ本

▼ 気に入ってる本