Blazor Server Template - Custom Logger
2022. 5. 12. 00:00ㆍASPNET/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}"); // 추가
}
실행
이전에 추가한 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}");
}
}
실행
관련영상
반응형
'ASPNET > BlazorServerTemplate' 카테고리의 다른 글
Blazor Server Template - Refactoring With Extension Method (0) | 2022.05.13 |
---|---|
Blazor Server Template - MediatR (0) | 2022.05.11 |
Blazor Server Template - Scrutor (0) | 2022.05.10 |
Blazor Server Template - Serilog (0) | 2022.05.09 |