스프링의 콘솔창의 로그 찍어내는 기능은 브레이크 포인트 까지 사용하여 디버깅을 하는
수고스러움을 덜어준다. 이 부분이 스프링부트를 해보며 높은 장점으로 보여졌다.
Core의 기본 템플릿에 ILogger; 요녀석과 추가 패키지를 설치해서 이런 부분을
닷넷에서도 구현할 수 있다.
주의
- 이 샘플은 NET8 로 진행 하였기에 그 이하 버전에서도 잘 될수 있겠지만 사용법이 약간 다를수 있습니다.
- IIS Express 를 통한 기본 디버깅에서 동작 합니다.
(Core부터는 NET CLR을 사용하지 않고 Kestrel 호스팅이기에 로컬 IIS설정을 통한 프로세스 디버깅은 패스합니다.)
1. 샘플 프로젝트 상태 (솔루션 2개)
- 클래스 라이브러리 : DataRepository
- 웹 MVC API 사이트 : WebLog
- 목적 : Debug 상태에서 DataRepository 에서 프로시저를 호출할 때 로그를 실시간으로 출력
2. DataRepository 에서 NuGet 패키지를 통해 2가지 패키지를 추가로 설치합니다.
- Serilog.AspNetCore
- Serilog.Sinks.Console
- Dapper (예제에서는 EFCore 대신 Dapper 를 사용합니다.)
3. WebLog 의 웹사이트에 종속성을 위해 Serilog를 Program.cs 에 추가
- !!! Serilog 추가 !!! 부분 참조
- Debug 일때만 로그 구성
using Serilog; // !!! Serilog 설정 !!!
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
// !!! Serilog 추가 !!!
builder.Host.UseSerilog();
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
// !!! Serilog 설정 !!!
Log.Logger = new LoggerConfiguration()
.WriteTo.Console()
.WriteTo.Debug()
.CreateLogger();
// Swagger
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();
4. 레파지토리 샘플 작동 구문
- using 문에 Serilog 필요
- Dapper를 사용
using Dapper;
using Serilog;
using System.Data;
using System.Data.SqlClient;
using System.Text;
namespace DataRepository
{
public class StudentRepository
{
private readonly string _connectionString;
private readonly ILogger _logger;
public StudentRepository()
{
_logger = Log.Logger.ForContext<StudentRepository>();
_connectionString = @"Server=127.0.0.1; Database=MyDB; User Id=sa; Password=12345678!!!;";
}
public List<StudentList> GetOnlineStudentList()
{
var students = new List<StudentList>();
string procedureName = "Test_StudentList_Select";
try
{
using (IDbConnection db = new SqlConnection(_connectionString))
{
var parameters = new DynamicParameters();
parameters.Add("@Name", "");
parameters.Add("@Code", "");
parameters.Add("@Page", 1);
parameters.Add("@PageSize", 30);
parameters.Add("@TotalCount", dbType: DbType.Int32, direction: ParameterDirection.Output);
students = db.Query<StudentList>(procedureName, parameters, commandType: CommandType.StoredProcedure).AsList();
_logger.Information($"EXEC {procedureName} @Name = '' , @Code = '', @Page = 1, @PageSize = 30, @TotalCount= TotalCount OUTPUT");
}
}
catch (Exception ex)
{
_logger.Warning($"{procedureName} 에러: {ex.Message}");
}
return students;
}
}
}
5. 웹 API 사이트의 컨트롤러에서 레파지토리 호출
using Microsoft.AspNetCore.Mvc;
using DataRepository;
namespace WebLog.Controllers
{
public class HomeController : Controller
{
private readonly StudentRepository studentRepository = new StudentRepository();
[HttpGet]
[Route("/api/home/index")]
public List<StudentList> Index()
{
return studentRepository.GetOnlineStudentList();
}
}
}
6. 로그 결과
- 닷넷코어 환경에서 IISExpress를 통한 디버그 모드를 실행시키면 기본적으로 콘솔창이 떠 있는데
아래처럼 프로시저 실행에 대한 로그를 찍어낼 수 있다.
- 레파지토리의 메소드 마다 로그를 심어 두면, 페이지가 이동될 때 마다 콘솔창에 로그가 찍히는 것을 볼 수 있다.
출력 터미널이 나타나지 않는다면..
- 출력창 하단 > 출력 > 출력보기에서 내 웹서버 선택
7. 보너스
- 다이나믹 파라미터를 매개변수로 받아 Key/Value 형태로 문자열을 생성해주는 메소드
public static string GetParameterString(DynamicParameters parameters)
{
var sb = new StringBuilder();
foreach (var paramName in parameters.ParameterNames)
{
var dbType = parameters.Get<dynamic>(paramName);
var value = parameters.Get<object>(paramName);
if (value is IDbDataParameter dbDataParameter && dbDataParameter.Direction == ParameterDirection.Output)
{
sb.Append($"{paramName}= {paramName} OUTPUT");
}
else
{
sb.Append($"{paramName} = '{value}'");
}
sb.Append(", ");
}
if (sb.Length > 0)
{
sb.Length -= 2;
}
return sb.ToString();
}