nikkie-ftnextの日記

イベントレポートや読書メモを発信

Hello WorldだけするF#のMinimal APIを例に、コンソールログの書式変更を試す

はじめに

七尾百合子さん、お誕生日 112日目 おめでとうございます! nikkieです。

dotnet watchdotnet runでMinimal APIを立ち上げたときの、コンソール出力について調べました。

目次

コンソールの表示が気になります

dotnet new webして「Hello World」できました。

ターミナルには以下のように表示されています

info: Microsoft.Hosting.Lifetime[14]
      Now listening on: http://localhost:5091
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Development
info: Microsoft.Hosting.Lifetime[0]
      Content root path: /.../minimal-api-practice/App

これがやや気になったのです。
どんな仕組みによるものなのでしょう?

WebApplication.CreateBuilder はログプロバイダーを追加する

dotnet new webで得た手元のApp/Program.fsには以下の行があります。

let builder = WebApplication.CreateBuilder(args)

ここでログの設定もされていました。
デフォルト設定が使われているわけです。

既定の ASP.NET Core Web アプリ テンプレートからは WebApplication.CreateBuilder が呼び出されます。これにより、次のログ プロバイダーが追加されます。(ログ プロバイダー

Console プロバイダーでは、コンソールへの出力がログに記録されます。(コンソール

2行のログを1行に書式設定

(Claude Codeに引っ張ってもらって得た動くコードを、ドキュメントにあたりながら理解を深め、ここに書きつけています)

+open Microsoft.Extensions.Logging

let builder = WebApplication.CreateBuilder(args)
+builder.Logging.AddSimpleConsole(fun options ->
+    options.SingleLine <- true
+) |> ignore

Simpleコンソールフォーマッタのオプションを指定しました。
https://learn.microsoft.com/ja-jp/dotnet/core/extensions/console-log-formatter#simple

1行になってる!

info: Microsoft.Hosting.Lifetime[14] Now listening on: http://localhost:5091
info: Microsoft.Hosting.Lifetime[0] Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0] Hosting environment: Development
info: Microsoft.Hosting.Lifetime[0] Content root path: /.../minimal-api-practice/App

タイムスタンプを表示したり色付きにしたりもできるんです!

open Microsoft.Extensions.Logging
+open Microsoft.Extensions.Logging.Console

let builder = WebApplication.CreateBuilder(args)
builder.Logging.AddSimpleConsole(fun options ->
    options.SingleLine <- true
+    options.TimestampFormat <- "HH:mm:ss "
+    options.ColorBehavior <- LoggerColorBehavior.Enabled
) |> ignore

今回のソースコードです

宿題事項

  • options.IncludeScopes(スコープ)ってなんだろう?
  • Claude Codeが書いた<-を使った書き方はドキュメントとは異なるのですが、F#とC#の違いなのかな?
  • タイムスタンプ追加できたので、Microsoft.Hosting.Lifetime[0]の部分を削るようなこともできるのかな?
    • optionsで有効・無効切り替える感じでなく、カスタムフォーマッタ
    • Claude Code迷走したので、deep researchからやるのがいいかも
  • .NET Core組み込みではなく、サードパーティのロギングを使うときはどうするんだろう?

終わりに

WebApplication.CreateBuilderによって、Minimal APIにデフォルトのログの設定もされていました。
SimpleConsoleFormatterOptionsを使って、1行にしたり、色を付けたり、タイムスタンプを表示したり、書式変更できました!

手を動かす中で思い出していたのは、Pythonのuvicornのロギングです。

Pythonのロギングと同じように考えていいならフォーマッタをいじればMicrosoft.Hosting.Lifetime[0]の部分は消せそうですが、果たして