ITの問題はなくならないのか

日々考えていることを書く

fluentdのconfigをrubyで書きたい

現状、rsyslogを使い、NW機器のlogをsyslogサーバに保存している。

出力先は、
/var/log/syslog/%fromhost%/%fromhost%.log
となり、logrotateで月次でローテートしているのが現状。

この状態で、
DC毎にあるsyslogサーバから全DCに疎通できる1台のsyslogサーバにログを転送したい!
という要件が発生してしまった。
ただし、ディレクトリ構造は以前のような形で、
DC名/%fromhost%/%fromhost%.logといった形にしたい、とのこと。

「まあrsyslogで今まで通り%fromhost%で書けば上手くいくっしょww」
ぐらいにしか思ってなかったんだが、いざrsyslog.confに以下のように書いてみると、
/var/log/syslog/DC名/%fromhost%/%fromhost%.log
当然上手く行かない。転送元syslogサーバのディレクトリしかできなくなってしまう。

「こんな時はfluentdでタグで分割して飛ばせばいいんだ!!」
と思い立ち、fluentdでconfigを書いてみることにした。
最初はfluentdでsyslogプラグインを入れようかと思ったんだが、既存のsyslogはあまり止めたくない。(絶賛稼働中なので)
fromhost毎にconfigを1個1個書いていくのは面倒くさいし、なおかつ非常にかっこ悪い。

じゃあrubyで書けばいいんじゃね?と思い、こんな形で書いた。
※ ログは/var/log/syslog/%fromhost%/%fromhost%.log に保存されるため、
 /var/log/syslog/*/*.logのものを見に行くこととした。

dirs = Dir.glob("/var/log/syslog/**")

dirs.each {|d|
	sub_dirs = Dir.glob("#{d}/**.log")
	sub_dirs.each {|d|
		basefile = File.basename(d)
		source {
			type :tail
			path d
			format '/^(?<message>.+)$/'
			tag basefile
			pos_file "/var/log/td-agent/#{basefile}.pos"
		}
	}
}

match ('**') {
	type :forward
	server {
		host "10.97.1.161"
		port "24224"
		heartbeat_type "tcp"
	}
}

rootでconfigチェックしてみたところ上手く行った!

# ruby /usr/sbin/td-agent -c /etc/td-agent/td-agent.rb --dry-run
〜省略〜
  <source>
    type tail
    path /var/log/syslog/10.173.8.15/10.173.8.15.log
    format /^(?<message>.+)$/
    tag 10.173.8.15.log
    pos_file /var/log/td-agent/10.173.8.15.log.pos
  </source>
  <source>
    type tail
    path /var/log/syslog/10.174.0.249/10.174.0.249.log
    format /^(?<message>.+)$/
    tag 10.174.0.249.log
    pos_file /var/log/td-agent/10.174.0.249.log.pos
  </source>
...........
  <match **>
    type forward
    <server>
      host 10.97.1.161
      port 24224
      heartbeat_type tcp
    </server>
  </match>

「よっしゃ!service td-agent startや!上手くいってると思うけど、とりあえずログを見てみるかw」

  <match **>
    type forward
    <server>
      host 10.97.1.161
      port 24224
      heartbeat_type tcp
    </server>
  </match>

なぜかここしか読まれない・・

1. /usr/sbin/td-agentに以下の内容を追加している
ENV["FLUENT_CONF"]="/etc/td-agent/td-agent.rb"
2. configの拡張子は.rbにしている
なのに、飛ばす部分しか読まれない。

原因を調査してみたところ、パーミッションが原因であった。

# ll /var/log/sys*
合計 148
drwx------ 2 root root 4096  2月 25 11:42 10.172.0.232
drwx------ 2 root root 4096  2月 25 11:42 10.172.3.231
.....

※ 当たり前だけど、権限が不足しているため読めません、なんてログは出てこない。

権限周りを見直し、無事飛ばせることを確認した。
次回は受け側の設定を行っていこうと思う。

以下のサイトを参考にさせていただいた。
Fluentd Config DSLについての話 - たごもりすメモ