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のようなツールは、開発用途よりも本番環境での使用のためにポート上のいくつかの抽象化を提供しますが、これらも開発用途での使用を意図しています。

関連項目