Open3

F# で Microsoft.Extensions.Logging を扱う

Kodai MatsumotoKodai Matsumoto

F# から Microsoft.Extensions.Logging パッケージを利用してコンソールにログを出力したい

.fsproj を作るのは面倒なので F# Scripts (.fsx) で記述する

logger.fsx
#r "nuget: Microsoft.Extensions.Logging, 6.0.0"
#r "nuget: Microsoft.Extensions.Logging.Console, 6.0.0"

このようにディレクティブを記述すれば、 Microsoft.Extensions.Logging, Microsoft.Extensions.Logging.Console 名前空間が利用可能になる

Microsoft.Extensions.Logging

ロギングに関するインターフェースを提供する

https://www.nuget.org/packages/Microsoft.Extensions.Logging/6.0.0

Microsoft.Extensions.Logging.Console

Microsoft.Extensions.Logging のインターフェースに対する、コンソールでのロギングのための幾つかの実装 (以下、ロギングプロバイダ) を提供する

https://www.nuget.org/packages/Microsoft.Extensions.Logging.Console/6.0.0

Kodai MatsumotoKodai Matsumoto

ロガーを作成・使用するための基本的な手順は以下のとおり

  1. LoggerFactory 型インスタンスを、Create クラスメソッドを介して得る
    • その際、コールバック関数内で ILoggerBuilder 型の引数に対して各種メソッドを呼び出すことで、ロガー実装に関する設定を行う
  2. LoggerFactoryCreateLogger インスタンスメソッドで、ロガーである ILogger 型インスタンスを得る
  3. ILogger 型インスタンスには LogTrace, LogDebug, LogInformation, LogWarning, LogError, LogCritical 等のメソッドがあり、それらを呼び出してロギングする
Kodai MatsumotoKodai Matsumoto

SimpleConsole と呼ばれるロギングプロバイダを選択してロガーを作成する例

logger.fsx
open Microsoft.Extensions.Logging

let () =
    use loggerFactory =
        LoggerFactory.Create(fun builder -> builder.AddSimpleConsole() |> ignore)
    let logger = loggerFactory.CreateLogger "myLogger"

LoggerFactoryIDisposable を実装しているので、ロギング終了時のリソース開放のために use バインディングを使用している

AddConsoleILoggingBuilder に対しての拡張メソッドだが、なぜか ILoggingBuilder を返却するので ignore している。AddConsole の呼び出しに副作用があるのにどうして ILoggingBuilder を返却しているのかはわからない。