센로그

14. Logging 본문

게임/ASP.NET Core

14. Logging

seeyoun 2024. 4. 15. 23:18

◆ 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");
          }
      }​​

  • 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를 설치한다.

https://datalust.co/download

 

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
Comments