Skip to content

ログの出力

ohr486 edited this page Jul 17, 2016 · 5 revisions

標準出力

現在のアプリの状況を知るために、ログにメッセージを出してみましょう。 標準出力にメッセージを出すには、IO.putsIO.inspectを使えば実現できます。

$ iex -S mix
> IO.puts "hello, IO.puts"
hello, IO.puts
:ok
> IO.inspect Map.new
%{}
%{}
>

ログファイルにメッセージを出力する場合は、Loggerモジュールを使います。

ロガーの設定

ロガーの設定は、config/dev.exs,config/test.exs,config/prod.exsで行います。

# config/dev.exs
# Do not include metadata nor timestamps in development logs
config :logger, :console, format: "[$level] $message\n"

詳しい設定等は、Loggerのドキュメントを確認してみてください。

ログの出力

ログはそれぞれ、debug,info,warn,errorといったレベルがあり、 それぞれのレベルに合わせたメッセージを出力することができます。 Loggerモジュールはこのレベルに対応したマクロをもっているので、以下の様にそれぞれのレベルに応じたメッセージを出力することができます。

defmodule Test do
  require Logger

  def log_dump_test do
    Logger.debug "Debugメッセージ"
    Logger.info "Infoメッセージ"
    Logger.warn "Warnメッセージ"
    Logger.error "Errorメッセージ"
  end
end
$ iex -S mix
> Test.log_dump_test

17:45:15.725 [debug] Debugメッセージ

17:45:15.726 [info]  Infoメッセージ

17:45:15.726 [warn]  Warnメッセージ

17:45:15.726 [error] Errorメッセージ
:ok
>

コントローラーへのロガー組み込み

それでは練習として、http://localhost:4000/listが呼ばれた時にログメッセージを出力してみましょう。 ロガーを仕込む箇所としては、web/controllers/list_controller.exlistアクションでよさそうです。

web/controllers/list_controller.ex

defmodule TokyoexHandsonDemo.ListController do
  use TokyoexHandsonDemo.Web, :controller

  # これを追加!
  require Logger # infoマクロを使うためにrequire

  def index(conn, _params) do
    # これを追加!
    Logger.info("/list accessed!") # メッセージをinfoレベルで出力

    my_list = TokyoexHandsonDemo.Repo.all(TokyoexHandsonDemo.Article)
    render conn, "index.html", list: my_list
  end
end

iex -S mix phoenix.serverでPhoenixを起動して、/listにアクセスするとメッセージが表示されます。

[info] GET /list
[debug] Processing by TokyoexHandsonDemo.ListController.index/2
  Parameters: %{}
  Pipelines: [:browser]
[info] /list accessed! # メッセージが表示される!
[debug] QUERY OK db=1.3ms decode=8.4ms
SELECT a0.`id`, a0.`title`, a0.`url`, a0.`og_title`, a0.`og_image`, a0.`og_description`, a0.`inserted_at`, a0.`updated_at` FROM `articles` AS a0 []
[info] Sent 200 in 121ms

見えましたか?