PhoenixのLogger

とりあえず、アプリが起動する状態になった。

Phoenix・Elixir をちょっとさわって思ったのは、コード上に型が現れてれていないとなにかと調べにくい、ということ。馴染みのある言語なら、型が現れてなくてもなんとかなっちゃうんだけど、馴染みのない言語だとそうはいかない。

結局コード見ててもわからないので、ログを出しまくって、どういう動きをするか、どういうデータが入力・出力されるのかを追っているところ(デバッガみたいなのはある?)。まあ、始めはログの出し方もわからなかったのだけれど。

Logger

ドキュメントはこちら

debug, info, warn, error の4レベルがある。

使い方としてはこんな感じ(サンプルはここで作ったhello_phoenixプロジェクト)。

defmodule HelloPhoenix.PageController do
  use HelloPhoenix.Web, :controller

  require Logger

  def index(conn, _params) do
    Logger.error "Error!!!"
    Logger.warn  "Warn!!"
    Logger.info  "Info!"
    Logger.debug "Debug"

    render conn, "index.html"
  end
end

ログの設定は config の下の設定ファイルで変えられる。

出力先はデフォルトで :console となっている。 ファイルに落とすにはリダイレクトするのかな...?と思って調べたら Backend というものがあって、そこにファイルに直接ログを出力する拡張機能を追加すれば、リダイレクトは不要。標準ではファイルに落とす拡張機能は用意されていないが、logger_file_backendが公開されていたので使ってみる。

まずは mix.exs 依存関係を追加して、% mix deps.get でダウンロードする。

--- mix.exs.orig 2015-08-15 15:12:58.149425240 +0900
+++ mix.exs   2015-08-15 15:13:18.074069599 +0900
@@ -31,6 +31,7 @@
     [{:phoenix, "~> 0.16"},
      {:phoenix_html, "~> 2.0"},
      {:phoenix_live_reload, "~> 0.6", only: :dev},
+     {:logger_file_backend, "~> 0.0.3"},
      {:cowboy, "~> 1.0"}]
   end
 end

設定ファイルはこんな感じ。

--- config/dev.exs.orig  2015-08-15 15:08:00.514099611 +0900
+++ config/dev.exs    2015-08-15 15:10:06.139743337 +0900
@@ -24,4 +24,7 @@
   ]

 # Do not include metadata nor timestamps in development logs
-config :logger, :console, format: "[$level] $message\n"
+config :logger, backends: [{LoggerFileBackend, :file}]
+config :logger, :file,
+  path: "/tmp/hello_phoenix.log",
+  level: :debug

結果

% cat /tmp/hello_phoenix.log
15:16:29.472 [info] Running HelloPhoenix.Endpoint with Cowboy on http://localhost:4000
15:16:49.496 [info] GET /
15:16:49.510 [debug] Processing by HelloPhoenix.PageController.index/2
  Parameters: %{"format" => "html"}
  Pipelines: [:browser]
15:16:49.526 [info] Sent 200 in 29ms