Blazor Server Template - Custom Logger

2022. 5. 12. 00:00ASPNET/BlazorServerTemplate

반응형

Logger Customize

 

Logger folder 추가

 

IApiLogger.cs 추가

using BlazorWebApp.Injectables;
using System.Runtime.CompilerServices;

namespace BlazorWebApp.Logger;
public interface IApiLogger : ITransientService
{
    void Log(LogLevel logLevel, string message, [CallerMemberName] string membername = "", [CallerFilePath] string filePath = "", [CallerLineNumber] int lineNumber = 0, params object[] args);

    void LogTrace(string message, [CallerMemberName] string membername = "", [CallerFilePath] string filePath = "", [CallerLineNumber] int lineNumber = 0, params object[] args);
    void LogDebug(string message, [CallerMemberName] string membername = "", [CallerFilePath] string filePath = "", [CallerLineNumber] int lineNumber = 0, params object[] args);
    void LogInformation(string message, [CallerMemberName] string membername = "", [CallerFilePath] string filePath = "", [CallerLineNumber] int lineNumber = 0, params object[] args);
    void LogWarning(string message, [CallerMemberName] string membername = "", [CallerFilePath] string filePath = "", [CallerLineNumber] int lineNumber = 0, params object[] args);
    void LogError(string message, [CallerMemberName] string membername = "", [CallerFilePath] string filePath = "", [CallerLineNumber] int lineNumber = 0, params object[] args);
    void LogError(Exception exception, string message, [CallerMemberName] string membername = "", [CallerFilePath] string filePath = "", [CallerLineNumber] int lineNumber = 0, params object[] args);
}


public class ApiLogger : IApiLogger
{

    private ILogger _logger;
    public ApiLogger(ILogger<ApiLogger> logger) => _logger = logger;

    public void Log(LogLevel logLevel, string message, [CallerMemberName] string membername = "", [CallerFilePath] string filePath = "", [CallerLineNumber] int lineNumber = 0, params object[] args)
    {
        _logger.Log(logLevel, message, membername, filePath, lineNumber, args);
    }

    public void LogDebug(string message, [CallerMemberName] string membername = "", [CallerFilePath] string filePath = "", [CallerLineNumber] int lineNumber = 0, params object[] args)
    {
        _logger.LogDebug(CreateLogMessage(message, membername, filePath, lineNumber), args);
    }

    public void LogError(string message, [CallerMemberName] string membername = "", [CallerFilePath] string filePath = "", [CallerLineNumber] int lineNumber = 0, params object[] args)
    {
        _logger.LogError(CreateLogMessage(message, membername, filePath, lineNumber), args);
    }

    public void LogError(Exception exception, string message, [CallerMemberName] string membername = "", [CallerFilePath] string filePath = "", [CallerLineNumber] int lineNumber = 0, params object[] args)
    {
        _logger.LogError(exception, CreateLogMessage(message, membername, filePath, lineNumber), args);
    }

    public void LogInformation(string message, [CallerMemberName] string membername = "", [CallerFilePath] string filePath = "", [CallerLineNumber] int lineNumber = 0, params object[] args)
    {
        _logger.LogInformation(CreateLogMessage(message, membername, filePath, lineNumber), args);
    }

    public void LogTrace(string message, [CallerMemberName] string membername = "", [CallerFilePath] string filePath = "", [CallerLineNumber] int lineNumber = 0, params object[] args)
    {
        _logger.LogTrace(CreateLogMessage(message, membername, filePath, lineNumber), args);
    }

    public void LogWarning(string message, [CallerMemberName] string membername = "", [CallerFilePath] string filePath = "", [CallerLineNumber] int lineNumber = 0, params object[] args)
    {
        _logger.LogWarning(CreateLogMessage(message, membername, filePath, lineNumber), args);
    }

    private string CreateLogMessage(string message, string memberName, string filePath, int lineNumber)
    {
        return $"[{memberName}] {message}. \nfilePath = {filePath} : line = {lineNumber}";
    }

}

 

Pages/Counter.razor 수정

...
@inject IApiLogger apiLogger
...

private void IncrementCount()
{
    ...
    apiLogger.LogInformation($"currentCount = {currentCount}"); // 추가
}

실행

Console 창 내용
Logfile 내용

 

이전에 추가한 ILogger<Counter>  에 의해 쓰여진 currentCount = 1 과

IApiLogger 에 의해 쓰여진 [IncrementCount] currentCount =1, filePath = xxxxxx 가 함께 쓰여 있다. 

 

 

일일이 logging 하는것은 좋은 방법이 아니다. 

mediatr 에 의해 data 가 전달 될때 마다 파일에 logging 되게 다음을 추가해 보자

 

Behaviors 폴더 추가

Behaviors/MediatRLoggingBehavior.cs 추가

using BlazorWebApp.Injectables;
using BlazorWebApp.Logger;
using MediatR;
using System.Diagnostics;
using System.Text.Encodings.Web;
using System.Text.Json;
using System.Text.Unicode;

namespace BlazorWebApp.Behaviors;

public interface IMediatRLoggingBehavior<TRequest, TResponse> 
    : IPipelineBehavior<TRequest, TResponse>, ITransientService
    where TRequest : MediatR.IRequest<TResponse>{ }

public class MediatRLoggingBehavior<TRequest, TResponse>
    : IMediatRLoggingBehavior<TRequest, TResponse>
    where TRequest : MediatR.IRequest<TResponse>
{
    private readonly IApiLogger _logger;

    public MediatRLoggingBehavior(IApiLogger logger)
    {
        _logger = logger;
    }

    public Task<TResponse> Handle(TRequest request,
        CancellationToken cancellationToken,
        RequestHandlerDelegate<TResponse> next)
    {
        string requestName = typeof(TRequest).Name;
        string uniqueId = Guid.NewGuid().ToString();
        string requestMessage = JsonSerializer.Serialize(request,
            new JsonSerializerOptions
            {
                WriteIndented = true,
                IncludeFields = true,
                Encoder = JavaScriptEncoder.Create(UnicodeRanges.All)
            });

        _logger.LogInformation($"Begin Request Id:{uniqueId}, " +
            $"request name:{requestName},\nRequest={requestMessage}");

        var timer = new Stopwatch();
        timer.Start();
        var response = next();
        timer.Stop();

        string responseMessage = JsonSerializer.Serialize(response.Result,
            new JsonSerializerOptions
            {
                WriteIndented = true,
                IncludeFields = true,
                Encoder = JavaScriptEncoder.Create(UnicodeRanges.All)
            });

        _logger.LogInformation($"End Request Id:{uniqueId}, " +
            $"request name:{requestName},\nResponse={responseMessage}" +
            $"\ntotal elapsed time: {timer.ElapsedMilliseconds}");

        return response;
    }
}

Handler/AddCount.cs

using MediatR;

namespace BlazorWebApp.Handler;

public class AddCount {

    public class Command : IRequest<Response>
    {
        public int CurrentValue { get; set; } 
        public int AddValue { get; set; }
    }
    public class Response 
    {
        public int CurrentValue { get; set; }
    }

    public class CounterHandler : IRequestHandler<Command, Response>
    {
        public async Task<Response> Handle(Command request, CancellationToken cancellationToken)
        {
            request.CurrentValue += request.AddValue;
            return await Task.FromResult(new Response() { CurrentValue =  request.CurrentValue });
        }
    }
}

 

Pages/CounterWithMediator.razor

@page "/counter/mediator"
@using BlazorWebApp.Logger
@using MediatR
@inject ILogger<Counter> logger
@inject IMediator  mediator

<PageTitle>Counter</PageTitle>

<h1>Counter</h1>

<p role="status">Current count: @currentCount</p>

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

@code {
    private int currentCount = 0;

    private async Task IncrementCount()
    {
        var response = await mediator.Send(new Handler.AddCount.Command
        {
            AddValue = 1, 
            CurrentValue = currentCount 
        });
        currentCount = response.CurrentValue;
        logger.LogInformation($"currentCount = {currentCount}");
    }
}

 

 

실행

 

 

 

관련영상

https://youtu.be/fx7MNgsNCrM

 

반응형