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についての話 - たごもりすメモ