箱のプログラミング日記。

渋谷の自社開発企業でRails書いてます。

Railsのloggerを使ってみた

f:id:y_hakoiri:20191102121704j:plain

特に必要だったわけじゃなんだけど、本を読んでて気になったloggerを少し触ってみたのでメモ。

loggerとは

rails sでサーバーを起動すると、ローカルでリクエストが走った時やSQLが走った時などターミナルにダダダっとログが出力されるけど、あれもRailsのloggerとしてきちんと保存されているんだって。

どこに保存されているのか

app/log/development.logに保存されてる。

username: sample_app hakopro $ cd log
username: log hakopro $ ls
development.log
development.log.20190919
development.log.20190920
development.log.20190921 
development.log.20190922 
development.log.20190923 
development.log.20190924 
・
・
・

わーお。めっちゃ出てきた!

日毎のログが一つのファイルに格納されてる状態。日付がないものが当日分(つまりリアルタイム分)ですね

あんまりないかもしれないけど、過去のログを再現したい時とかはここを参照すれば確認できなくもなさそう。

ちなみに、私は使ったことがないんだけどdelayed_job.logとかcron.jobとかもここにたくさんありました。

自作したログを出力する

当然、自分で作ったログを出力することもできるのでやってみる

準備

logger.debug "文字列"

という形でログを新しく作ることができる。(debugの部分はログレベルを指定)

users_controller.rb

def create
 @user= User.new(user_params)
 logger.debug "hogehoge--------------------"

 if @user.save
  redirect_to root_path, notice: "ユーザーを作成しました"
 else
  render :new
 end
end

ログはリクエストが走った時に出力するのがふつうなので、コントローラーに書きます。

例が微妙だけど、とりあえず適当にユーザーを作成した時に「hogehoge--------------------」という目立ちやすいログを入れてみます。

ユーザーを作成

ブラウザからユーザーを作成し、ターミナルに出力されたログを確認してみたところ

Processing by UsersController#create as HTML
  Parameters: {"utf8"=>"", "user"=>....省略.... "commit"=>"登録"}
hogehoge------------
(0.2ms)  BEGIN
・
・
SQL (3.9ms)  INSERT INTO `users`.....

お!確かに「hogehoge------------」がちゃんと出力されている。

(業務のプロダクトを使ってる関係で細かいところは色々と省略)

createアクションでsaveされる前にloggerで吐き出すようコントローラーで書いたので、パラメーターが渡ってきてSQLのINSERTが走る前のところでログが挟まれているのが確認できます。

loggerファイルも見てみる

ターミナルで確認できたということは、loggerファイルにも書き込まれているはずなので念のため確認してみる。

username: sample_app hakopro $ cd log
username: log hakopro $ less development.log | grep "hogehoge--------------------"
hogehoge--------------------

お。ちゃんと保存されてました。

ちなみに

loggerファイルはデフォルトでは日別で一つのファイルが生成されるようになっているけど、設定を変更することもできる

config/environment/development.rb

config.logger = ActiveSupport::Logger.new("log/development.log", 'daily')

ここのdailyをweeklyにしたりすればOK。

まとめ

  • Railsのサーバーログはapp/log/development.logに格納されている
  • ログを意図的に吐き出したい場合は「logger.debug "文字列"」

特に今後の仕事で直接的に活かせそうではないけどw、知っているのと知らないのとでは仕事の進め方も違ってくる気がするので、実際に触って見てとても勉強になりました。

参考:現場で使える Ruby on Rails 5速習実践ガイド