shuhelohelo’s blog

Xamarin.Forms多めです.

Xamarin.FormsでASP.NET CoreなDI(Dependency Injection) (6) Logger

前回はHttpClientを使う方法について書きました.

今回はLoggerの使い方です.

以前に書いたとおり,Microsoft.Extensions.HostingパッケージにはLoggerも含まれているので,Loggerを介したロギングの機能も使うことができます.

shuhelohelo.hatenablog.com

今回はVisual Studioのコンソールへのログの出力についてです.

Startup.csのInitメソッド内で,HostingBuilderを使ってHostのインスタンスを作成しますが,ここにLoggerの設定を追加します.

            var host = new HostBuilder()
                .ConfigureHostConfiguration(c =>
                {
                    //これは?
                    c.AddCommandLine(new string[] { $"ContentRoot={FileSystem.AppDataDirectory}" });

                    //設定ファイルを読む
                    c.AddJsonStream(stream);
                })
                .ConfigureServices((c, x) =>
                {
                    //プラットフォーム固有機能のDIを行うためのコールバックを実行
                    nativeConfigureServices(c, x);
                    ConfigureServices(c, x);
                })
                .ConfigureLogging(l => l.AddConsole(o =>
                {
                    //Loggerの設定
                    o.DisableColors = true;
                }))
                .Build();

以下の部分がそれにあたります.

                            .ConfigureLogging(l => l.AddConsole(o =>
                            {
                                o.DisableColors = true;
                            }))

特にサービスの追加(AddTransientなど)を行う必要はありません.

さて,それでは使ってみましょう.

DIされる任意のクラスでLoggerインスタンスを渡すことができますが,今回はSecondPageViewModelクラスで使ってみます.

SecondPageViewModelクラスのコンストラクタを以下のようにし,特に意味はありませんがログを出力するようにします.

        public SecondPageViewModel(ILogger<SecondPageViewModel> logger = null, IHttpClientFactory httpClientFactory = null)
        {
            logger?.LogInformation("Here is SecondPageViewModel!");

ILoggerの型引数には,このLoggerが注入されるクラスの名前を指定します.つまり,今回はSecondPageViewModelを指定しています.

ILogger<このロガーが注入されるクラス名> logger

さて,これで実行してみましょう.

ブレークポイントを設置して確認すると,Loggerのインスタンスが渡されているのがわかります.

f:id:shuhelohelo:20200701174459p:plain

余談ですが,SecondPageに遷移する前,起動時にSecondPageViewModelがインスタンス化されていることがわかりますが,これはアプリ起動時にすべてのページがインスタンス化されるようになっているためです.

Shellではページ遷移時にインスタンス化されるようにできますが,Shellではページのインスタンス化にはデフォルトコンストラクタが必須のためページに対するコンストラクタインジェクションはできなかったり.

さて,Visual StudioのOutputタブを開いて出力をさかのぼっていくと,以下のようにLoggerによって出力された部分が見つかります.

f:id:shuhelohelo:20200701175237p:plain

コンソールへのログ出力がとても簡単にできることがわかりました.

コンソール以外への出力

モバイルアプリだとローカルに一定期間分保存することになるのだろうか?

調べる.

docs.microsoft.com