【Rails】取得したlogデータを元にデバッグをする方法
前回のメモ
前回の記事で、logファイルから該当するデータの抽出方法をまとめた。
正確には該当する行の抽出方法だけども。
抽出したデータを元にrailでデバッグする方法をメモしておく。
yasagori-programing.hatenablog.jp
ファイルの読み込み
grep
を使ってデータを抽出しても、それをDBに一つずつ移していくのは面倒。
そこで、rails console
を使ってファイルの読み込みができないか調べたら、出てきたのがFile.Open
。
例えば前回同様yasagori.txt
ファイルを使ってみる。
ファイルの中身はこんな感じ。
hoge fuga piyo
このファイルをrails console
で開くにはこうすれば良い。
File.open('yasagori.txt') do |f| puts f.gets # ファイルの1行目を出力 puts f.gets # ファイルの2行目を出力 end => hoge fuga
それぞれの行に対して何かをしたいときはeach_line
メソッドを使えば良い。
File.open('yasagori.txt') do |f| f.each_line do |line| puts line end end => hoge fuga piyo
rails consoleでアクションを実行
で、本題。
取得したデータを上のFile.open
を使って読めるようになったら、そのデータを元にcontrollerのアクションを動かす必要がある。
そこで使うのが次の方法。
例えばhoge_controller.rb
がこんな内容だったとする。
class HogeController < ApplicationController def index # getアクション, pathは"/hoge" # 省略 end def create # postアクション、paramsが必要。pathは"/hoge/create" # 省略 end end
それぞれのアクションを実行するにはrails console
で次のコマンドを入力すれば良い
# get app.get '/hoge' # post app.post '/hoge/create', {params: ~~~ # 入力したいパラメータ}
コレで指定したアクションの実行が可能となる。
注意ポイント
注意すべきポイントは2つ。
- そのままのコードだとgetの前にidが必要だったりするので、その処理を忘れずに追加しないといけない。
- viewファイルを開こうとするとエラーになるので、
render :nothing => true
を入れておく
ファイルを開いて実行するまで
例えば以下のようなyasagori.txt
ファイルがあったとする。
/hoge/production.log [2020-03-29-00:00:00] INFO -- : [piyopiyo] Parameters : {id: 1, name: "Yasagori"} /hoge/production.log [2020-03-29-00:00:05] ~~~ ~~~
このパラメーター以下のデータをパラメータとしてcreateアクションに渡して叩く場合、こんな感じにすれば良い。
# rails console上で行う File.open('yasagori.txt') do |f| f.each_line do |line| reg = /Parameters : /.match(line) # 正規表現で"Parameters : "を含むそれ以降の文字列を取得 rebuild_params = eval(reg.post_match) # post_matchで"Parameters : "以降の文字列を選びevalでhash化 app.post '/hoge/create', {params: rebuild_params} end end
コレにより、yasagori.txt
に入っていた取得したログデータの回数分createアクションを実行することができる。
使い所
本来ならlogデータやDBの値から抽出できれば良いのだが、アクションの途中で出てきて保存していないデータなどを復元したいときなどに使える。
ちなみに、DBに保存しないデータは新たにlogファイルを作ってそこに入れるようにしてあげれば良い。
# config/development.rbに追記 # another_loggerメソッドを定義。yasagori.logに吐き出す config.another_logger = Logger.new(Rails.root.join('log/yasagori.log')) # hoge_controller.rbに追記 def create ~~~ piyo = ~~~ # DBに保存されないpiyo変数を見たい Rails.application.config.another_logger.info(piyo) end
上の場合はpiyo変数に入った値がyasagori.log
にごっそり出てくる。
まとめ
DBやlogに残らないデータを復元しようとすると、
- logから入力データを復活
- アクションを再び実行
- DBに保存されないから、logファイルを別に作って吐き出す
という手間がかかるので、初期段階で必要になりそうなものはDBに保存するようにするべき。