Day 20 纪录Log

在开发系统时,纪录是一件很重要的事,前面都没有提到,笔者在最近才想到这点,所以就来实作吧!

由於笔者用的是 Blazor Server,官方文件提供的只有 Blazor WebAssembly 的做法,所以先来试试看後者。

首先打开之前建立的 BlazorWasm 专案,在Counter.razor加入@using Microsoft.Extensions.Logging;及注入服务@inject ILogger<Counter> logger;,接着在原本的IncrementCount()内加入要提示的讯息,这边用的是LogWarning(),除此之外还有LogCriticalLogDebugLogError等等可以使用。

@page "/counter"
@using Microsoft.Extensions.Logging;
@inject ILogger<Counter> logger;

<h1>Counter</h1>

<p>Current count: @currentCount</p>

<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>

@code {
    private int currentCount = 0;

    private void IncrementCount()
    {
        logger.LogWarning("有人点击我了!");

        currentCount++;
    }
}

接着将启动专案改成 BlazorWasm 专案,启动後前往 Counter 页面,点击按钮後,按下 F12 切换到 Console 页签,可以看到显示了我们定义的讯息。
https://ithelp.ithome.com.tw/upload/images/20210920/20140893umddDS736x.png

在 Blazor WebAssembly 这麽简单,那在 Blazor Server 也是一样吗?

可惜的是 Blazor Server 并不支援这样的作法,目前只能用IJSRuntime的方式呼叫浏览器的console.log提示讯息,想要有不同层级的讯息也必须自己客制化。

我们切回 Blazor Server 专案,在JsInteropClasses加入ConsoleLog()方法,里面做的事情就只有呼叫console.log()

        public async Task ConsoleLog(string message)
        {
            await js.InvokeVoidAsync("console.log", message);
        }

接着在Blog.razor.cs覆写OnAfterRenderAsync(),在里面呼叫ConsoleLog()

        protected override async Task OnAfterRenderAsync(bool firstRender)
        {
            await jsClass.ConsoleLog("这是Blazor Server的console.log讯息");
        }

https://ithelp.ithome.com.tw/upload/images/20210920/20140893HBmE5zw9T1.png

之所以不写在OnInitializedAsync()是因为我们采用预先渲染(pre-render)的方式,此时的 JavaScript 还没准备好,如果在OnInitializedAsync()呼叫,会发生下图的错误。
https://ithelp.ithome.com.tw/upload/images/20210920/20140893ltX5yQmLRi.png

要是一定要在OnInitializedAsync()呼叫的话,可以去_Host.cshtml<component>render-mode属性从ServerPrerendered改为Server

Server 的render-mode分为三种:StaticServerServerPrerendered,第一种速度最快,将全部 Component都转变为静态 HTML 档案;第二种最慢,会先将一种标记传出,等到使用者启动该 Component 後才会真的渲染成 HTML 档案;第三种是折衷方案,先把 Component 变成静态 HTML 档案但没有互动功能,等到使用者启动该 Component 後才会通知 Server 将功能补上。

这也是为什麽render-mode改成Server才有效的原因,因为此时的ConsoleLog()还没转成 JavaScript 档案。

Ref:ASP.NET Core Blazor logging

Ref:LoggerExtensions Class

Ref:How can I write into the browser´s console via Blazor WebAssembly?

Ref:Blazor Server

Ref:What's the difference between RenderMode.Server and RenderMode.ServerPrerendered in blazor?

Ref:RenderMode Enum


<<:  Day 5 用 Ruby 印东西

>>:  RISC-V: 妈,我把脏脏的扣变成 CPU 的形状了!

Day9 - 串接 LINE Login 与 LIFF

Heroku 网址:https://www.heroku.com/ LINE Developers...

Day 5 - 安全签章: 取得 SHA256 加密後的 Sign 值

图 5-1: 各栏位资料范例 在 Day 2 我们知道了取得 Nonce 的方法。在 Day 3 ...

Day07:始祖巨人

在学习Java继承的部分时,就想到进击巨人的设定,九大巨人的能力只要被其他人吃掉,能力就会被传承过去...

[Day-01] - Learn Spring Framework In One Month. ​

本文章「Learn Spring Framework In One Month」目的在提供读者可快速...

[Day 16]新试剂服英战士(後端篇)

挑战目标: MockNative Camp 昨天我们建立了CommonResponse.java来做...