研究でRailsのdevelopment.logを監視して,特定のキーワードが出現したら何かするツールを欲しくなりました.
これまではtail -fを使っていたのですが,Windowsなどでも動作することを考えて,Rubyだけで実装したくなったわけです.
Rubyでtail -fを実行する方法はないかとググると以下の記事が見つかりました.ありがとうございます.
そのまんま利用させてもらおうとしたのですが,実はこのコードを実行するとRubyプロセスのCPU占有率が100%近くになってしまいました.
テストサーバなので,ログイベントが発生するのは数十秒に1回くらいです.ちょっと工夫してみました.上記のQiitaのコードをほぼそのまま利用させてもらっています.ご了承ください.
f = open('./log/development.log')
begin
f.sysseek(-32, IO::SEEK_END) #末尾から32byte取得
rescue
f.sysseek(0, IO::SEEK_SET) #ファイルが32byte以下だった場合は、先頭から
end
s = ""
while true
f.sysread(128, s) rescue nil
if s.include?( "何らかの文字列" )
# 何らかの処理
end
if s.size == 0 #
# print '.'
sleep 1
else
puts s #デバッグ用, 読み込むべきデータがあるならsleepせずさっさと読み取る
end
end
という感じです.
Railsに限らず,他の開発系のログや,Webサーバーのアクセスログを監視して何かするときとかに気軽に利用できるのではないかと思います.あくまで「開発系」でですが.
tailコマンドなどLinuxコマンドを組み合わせて何かする処理も書けますが,細かいことやろうとするとプログラミング言語の方が楽ですからね.
福岡は今日もよい天気です😁
でわ