何度も似たようなのを書いては捨ててるような気もするけど、性懲りもなくまた書いた。
GitHub - kyanny/rails-log-block-grep
Rails のログは apache やら lighttpd やらのログ (common とか extended/combined とかよばれる) と違って一リクエストが複数行にまたがるので、ふつうに grep すると前後の行が欠落しリクエスト全体を把握するのが難しくなるため -A -B オプションを駆使して前後の行も出力する必要がある。しかし必要な前後の行数はまちまちで、特に例外が発生してたりするとバックトレースがずらずら出て -A 10 -A 20 -A 30 ... とか何度も調整するはめになってとてもめんどい。のでリクエスト全体のテキストに対してマッチさせてマッチしたら何行あろうと全部出るようにした。
$ tail -n 10000 log/production.log | ./rails-log-block-grep.pl FooController#index
とかして使う。とりあえず最低限のことはできてる。とはいえ -A -B オプションは欲しいので気が向いたら (というか必要に迫られたら) 実装したい。あとあんまり速度は出ない。メモリは無駄食いしないようにほんの少し気をつかったつもりだけど自信はない (というかみればわかるけどまったくたいしたことはしていない)
今回ふと「正規表現の、ゼロ幅の先読みマッチを使ったらいいんじゃないか?」と思って使ってみたけど、これがどうなのかもよくわからない (効率の善し悪しとかそういう意味で) あと最初は Ruby で書いてたんだけど modifier の /m /s とか ^ $ あたりの挙動でよくわからなくなって、細かい調整する前で速度もメモリ消費量もずっと悪かったので Perl で書いてそのまま逆移植しなおすのが面倒になってしまった。