【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に保存するようにするべき。