Elm:
ロギング
方法
Elmのアーキテクチャは、箱から出してすぐに使えるログのような副作用をサポートしていません - それらはコマンドを通して扱われ、それはあなたのアプリケーションのアーキテクチャの一部です。教育目的で、ポートを通じてJavaScriptへメッセージを送信することによりログをシミュレートする方法を見てみましょう。
まず、ポートモジュールを定義します:
port module Logger exposing (..)
-- JavaScriptにログを送出するためのポートを定義する
port log : String -> Cmd msg
Main.elm
内で、ログメッセージを送出するためにlog
ポートを使用します:
import Logger exposing (log)
update : Msg -> Model -> (Model, Cmd Msg)
update msg model =
case msg of
AnEvent ->
-- ここでモデルにいくつかの更新を行う
( updatedModel, log "AnEvent occurred." )
AnotherEvent ->
-- ここでモデルに他の更新を行う
( anotherUpdatedModel, log "AnotherEvent occurred." )
JavaScript側では、入ってくるログメッセージを処理するためにlog
ポートを購読します:
var app = Elm.Main.init({ /* ... */ });
app.ports.log.subscribe(function(message) {
console.log(message);
});
これによりJavaScriptコンソールでのサンプル出力は以下のようになります:
AnEvent occurred.
AnotherEvent occurred.
深掘り
伝統的に、PythonやJavaなどの言語では、ログはログライブラリを使用して行われ、debug、info、warning、error、criticalなどの様々なレベルでメッセージをログに記録するための直接的なAPIを提供します。
純粋性と不変性に焦点を当てているElmでは、この種の直接的なログを提供していません。なぜなら、IOや副作用はElmアーキテクチャを通じて明確に管理されているからです。
Elmで完全な機能を持つログが必要な場合、通常は外部のJavaScriptツールに頼ります。上述のように、ポートはこれらのツールへの橋渡しを行います。Debugモジュールも別の選択肢ですが、これは開発用途のみを意図しており、本番環境でのログのためには使用されません。
ポートに加えて、プログラマーはElmのコンパイラーメッセージやランタイムデバッグ施設、例えばDebug.log
をしばしば使用します。これは、値をトレースするためにコードに挿入することができ、次のように式をラップしてその出力をコンソールにログします:
view model =
Debug.log "Model Debug" model
-- ここでビューコードが続きます
これもまた、本番使用を意図していません。elm-loggerのようなツールは、開発用途よりも本番環境での使用のためにポート上のいくつかの抽象化を提供しますが、これらも開発用途での使用を意図しています。
関連項目
- Elmのポート: https://guide.elm-lang.org/interop/ports.html
- Elmの
Debug
: https://package.elm-lang.org/packages/elm/core/latest/Debug - Elmとログに関する議論:https://discourse.elm-lang.org/t/elm-and-logging/546
- JavaScriptコンソールAPI:https://developer.mozilla.org/en-US/docs/Web/API/Console
- elm-loggerパッケージ:https://package.elm-lang.org/packages/arkgil/elm-logger/latest/