센로그
14. Logging 본문
◆ Logging
로깅은 언제 해야 하느냐?
- 버그를 찾을 때.
서버에서는 로깅이 특히 중요하다.
중단점으로는 디버깅하기 어려운 경우가 많기 때문
ASP.NET Core에서는 어떻게 로깅할까?
기본적으로 ILogger라는 로깅 클래스를 제공한다.
- ILogger : 로깅을 하는 주체
- ILoggerProvider : 어디에 로깅할지
- ConsoleLoggerProvider
- FileLoggerProvider
- ...
Program.cs의 builder을 통해 로깅 기능을 설정할 수 있다.
얘를 실제로 사용하기 위해서는 DI를 이용해 ILogger을 주입해주면 되는데,
MVC 기본 플젝에서는 홈컨트롤러가 기본적으로 ILogger<HomeController> _logger 을 갖고있다.
따라서 아주 간단하게는 이런식으로 로깅해주면 된다. (HomeController에서)
_logger.LogInformation("Hello Log!");
ASP.NET Core Logging
ASP.NET Core에서 로깅과 관련된 요소들은 어떤 게 있는지 살펴보자
- LogLevel
- 중요도를 의미
- 별 거 아닌 로그인지, 치명적인 버그에 관한 로그인지 등등
- 다음 중요도마다 각각 대응하는 함수들이 존재한다. (LogCritical(), LogError(), ...)
- Critical
- 메모리 부족, 디스크 용량 부족 등
- Error
- DB에러, 널 크래시 등
- Warning
- 코드 동작이 예측한 것과 다르게 동작하는 경우
- Information
- 정보 제공. 유저가 로그인 했다. 이런 거
- Debug
- 개발 단계에서 디버깅 용도
- Trace
- 이외의 하찮은 것들. 잘 사용 안함
- 중요도에 따라 로그를 선택해서 볼 수 있음
- Event Category
- ILogger<T> 에서의 T를 의미함. 즉 어떤 카테고리(기본적으론 컨트롤러)에서 로그를 찍은건지 구분하는 것
public class HomeController : Controller { private readonly ILogger<HomeController> _logger; public HomeController(ILogger<HomeController> logger, IAuthorizationService auth) { _logger = logger; } }
중요도: 카테고리
메시지 - DI를 통해 컨트롤러 이름이 아닌 별도의 카테고리 명을 설정할 수도 있음
public class HomeController : Controller { private readonly ILogger _logger; public HomeController(ILoggerFactory factory) { _logger = factory.CreateLogger("TestCategory"); } }
- ILogger<T> 에서의 T를 의미함. 즉 어떤 카테고리(기본적으론 컨트롤러)에서 로그를 찍은건지 구분하는 것
- Message
- 로깅 메시지
- 두 가지 방식이 있음.
- InterpolatedString 방식
- LogInformation($"Hello {name}");
- Placeholder 및 parameters 방식
- LogInformation("Hello {0}", name);
- 로깅을 할 땐 InterpolatedString 방식보다 이 방식이 조금 더 편하다고 함
- 로깅 메시지
- Exception
- 예외가 일어났을 때, 예외가 일어난 객체를 같이 넘길 수 있음
- EventId
- 기본 0
- 비슷한 유형을 묶어서 이벤트 아이디를 통해 구분 가능
Logging Provider
Logging Provider에 대한 이야기도 해보자.
어떤 식으로 로그를 찍을지에 관한 이야기임.
로그를 찍는 방식은 여러 가지가 있다.
- 콘솔 로깅
- 개발 단계에서는 유용하지만, 실제 라이브 서버에서는 모니터 앞에 앉아서 콘솔만 보고 있을 사람이 없다.
- 파일 로깅
- 3rd파티 사용
- ...
- ...
그중 파일 로깅 서드파티 하나를 사용해보자.
RollingFile이라는 서드파티 패키지를 사용해서 파일 로깅을 해볼 것이다.
1. 프로젝트 우클릭하고 NuGet 패키지 관리에 들어가서
찾아보기 누르고 rollingfile 검색 ㄱㄱ
설치 ㄱㄱ
2. Program.cs의 builder에다 파일형태의 LoggerProvider 을 추가해준다.
builder.Logging.AddFile();
- AddFile() 이란 걸 쓸 수 있게 되었다.
이러면 이제 파일로 로그를 남길 수 있게 된다!!
3. 실행한 후, 프로젝트 폴더를 열어보면 Logs라는 폴더 안에 로그가 생긴 걸 볼 수 있다.
- 콘솔에 나오던 로그들이 이렇게 파일에도 저장된다!
이외에도 DB에 로그를 저장하거나, 서치엔진에 저장하거나 하는 등 다양한 로깅 서드파티 패키지들이 있으니
필요에 따라 잘 찾아보고 사용하면 된다.
LogVerbosity
LogVerbosity 라는 것도 있다.
얼마나 상세하게 로그를 표현할거냐에 관한 이야기임.
로깅이 편리하긴 한데, 너무 많아지면 보기가 힘들다..
따라서 적당히 원하는 수준만 로그가 찍히도록 규칙을 정하고 싶을 때 사용하는 게 LogVerbosity이다.
직접 LogVerbosity를 설정해보자.
1. 우선 Program.cs에다 다음 코드를 추가해준다.
builder.Logging.AddConfiguration(builder.Configuration.GetSection("Logging"));
2. 그리고 appsettings.json을 들어가보자.
{
"ConnectionStrings": {
"DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=aspnet-IdentityCore-ea99fd00-9f6e-4b30-96f4-23d1edda48cd;Trusted_Connection=True;MultipleActiveResultSets=true"
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
}
- 기본 로그 레벨이 설정되어 있다.
- 기본적으로는 Information 수준 이상부터, Microsoft.AspNetCore 의 경우에는 Warning 수준 이상부터 로그를 찍겠다는 뜻
여기에 몇가지 로깅 Configuration 설정을 추가해보자.
{
"ConnectionStrings": {
"DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=aspnet-IdentityCore-ea99fd00-9f6e-4b30-96f4-23d1edda48cd;Trusted_Connection=True;MultipleActiveResultSets=true"
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
},
"Console": {
"LogLevel": {
"Default": "Critical",
"Microsoft.AspNetCore": "Warning"
}
},
"File": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
}
},
"AllowedHosts": "*"
}
- Console인 경우 기본 메시지는 Critical 수준 이상부터 찍도록 했다.
- 실행하니, 콘솔창에서 Information 수준의 로그들이 다 사라졌다!
- 그러나 파일에는 그대로 Information 수준부터 찍도록 했다.
Structure Logging
서드파티 툴을 사용해 로깅하는 것을 의미한다.
어떤 문제가 발생하면 모든 로그들을 추출해서 비슷한 케이스들이 있는지, 아니면 로그가 일어난 시점이 언제인지 등 로그에 대한 분석을 자주 하게 될 것이다.
그런데 단순하게 문자열로 모든 로그를 찍도록 하면, 상세 정보를 알기위한 탐색이 어렵기에 이 작업이 굉장히 힘들어진다.
이런 문제를 해결하기 위해 서드파티 툴들을 많이 사용한다.
- Seq
- ElasticSearch
- ...
그중 Seq를 한번 살펴볼 것이다.
1. 우선 seq를 설치한다.
Seq — centralized structured logs
Seq is the self-hosted search, analysis, and alerting server built for structured log data.
datalust.co
2. 프로젝트의 NuGet 패키지 관리자에서 Seq를 설치한다.
3. 그리고 Program.cs의 builder에다 Seq 로깅 프로바이더를 추가해준다.
builder.Logging.AddSeq();
4. 그러면 이제 Seq 관리자 페이지에서 편하게 로그를 관리하고 분석할 수 있다.
- 수준별 로그를 볼 수 있다
- SQL 쿼리와 유사하게 로그 내용으로부터 데이터를 긁어올 수도 있다.
'게임 > ASP.NET Core' 카테고리의 다른 글
15. Custom Middleware (0) | 2024.04.15 |
---|---|
13. Authorization (0) | 2024.04.15 |
12. Authentication (0) | 2024.04.15 |
11. Filter (0) | 2024.04.15 |
10. Configuration (0) | 2024.04.15 |