memorandums

日々の生活で問題解決したこと、知ってよかったことなどを自分が思い出すために記録しています。

ログファイルを監視して何かするRubyコード(メモ)

研究でRailsのdevelopment.logを監視して,特定のキーワードが出現したら何かするツールを欲しくなりました.

これまではtail -fを使っていたのですが,Windowsなどでも動作することを考えて,Rubyだけで実装したくなったわけです.

Rubyでtail -fを実行する方法はないかとググると以下の記事が見つかりました.ありがとうございます.

Rubyでtail -fする - Qiita 書き込まれ続けているファイルに対してtail -fのような感じで末尾の出力を読み取り続ける方法。 方法 tail_ qiita.com

そのまんま利用させてもらおうとしたのですが,実はこのコードを実行すると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コマンドを組み合わせて何かする処理も書けますが,細かいことやろうとするとプログラミング言語の方が楽ですからね.

福岡は今日もよい天気です😁

でわ