Skip to content

Trouble Shooting

Fox Logging을 사용할 때 발생할 수 있는 문제점들을 나열하고 해결 방법을 제시합니다.

로그가 기록되지 않음

Fox Logging 에서 가장 흔하게 발견되는 문제는 로그가 기록되지 않는 현상 입니다. 적절한 로깅 구성 설정을 수행했으며 적절히 GetLogger 메서드를 호출하고 Write 메서드를 호출했다고 생각했지만 로그가 기록되지 않는 현상입니다.

1
2
3
4
5
6
namesapce HR.Salary;

IFoxLog log = FoxLogManger.GetLogger<SalaryService>();
log.Write(FoxLogLevel.Information, "log message...");

// 로그가 전혀 기록되지 않음...

로그 필터링

Fox Logging 에서 아무런 설정을 하지 않은 경우 기본 필터링 수준은 Warning 입니다. 따라서 위 코드에서 기록하는 Information 수준 로그는 필터링 되어 로그가 기록되지 않습니다.

로깅 구성 설정의 "logging:filter" 속성을 지정하여 전역 필터 수준을 지정하거나 해당 로거 설정에서 "filter" 속성을 지정하여 필터링 수준을 낮추십시요.

대체 로거 문제

로그가 기록되지 않는 또 하나의 대표적인 이유는 GetLogger 호출에 사용한 로거 이름이 등록되지 않았기 때문에 발생합니다.

위 예제 코드에서 GetLogger 메서드 호출에 사용된 로거의 이름은 HR.Salary.SalaryService 입니다. FoxLogManager 클래스는 등록된 로거들 중 이름이 HR.Salary.SalaryService 인 로거를 찾습니다. 만약 이 로거를 찾지 못한 경우 로거 이름 레벨링 기능에 의거해 이름이 HR.Salary 로거를 찾으며 그 다음엔 HR 이라는 이름의 로거를 찾습니다. 이들 로거를 모두 찾지 못한 경우 FoxLogMangager대체 로거(fallback logger)를 반환합니다.

대체 로거인 로그 필터 수준에 관계 없이 FoxDummyLogger 는 모든 로그 기록을 필터링 하기 때문에 어떤 로그도 기록되지 않습니다. 따라서, 로깅 구성 설정에 구성된 로거 중 어떤 로거도 GetLogger 메서드를 통해 찾을 수 없기 때문에 로그가 기록되지 않는 현상으로 보입니다.

먼저, 로깅 구성 설정에서 로거 이름에 오타가 있는지 확인하십시요. 예상 외로 로거 이름의 오타는 가장 많은 문제의 원인입니다. 오타를 찾기 어렵다면 로깅 구성 설정에서 대체 로거 기능을 해제하는 "logging:useFallbackLogger" 속성을 false 로 지정하십시요.

UseFallbackLogger 속성이 false 로 지정되면 FoxLogManager 는 로거를 찾지 못한 경우 FoxInvalidConfigurationException 예외를 발생시키며 어떤 로거를 찾지 못했는지 메시지를 통해 알려줍니다. 예를 들어 다음과 같은 로깅 구성 설정을 위 C# 코드와 함께 사용했을 때,

{
  "logging": {
    "useFallbackLogger": false,
    "loggers": {
      "HR.Salery": {
        "providerType": "NeoDEEX.Diagnostics.Loggers.FoxConsoleLoggerProvider"
        "filter": "Verbose"
      }
    }
  }
}

다음과 같은 예외 메시지가 발생합니다. 이 예외의 원인은 로거 이름이 HR.Salary 가 아닌 HR.Salery 로 지정되어 있기 때문입니다.

1
2
3
4
5
NeoDEEX.Configuration.FoxInvalidConfigurationException: 'HR.Salary.SalaryService' 이름을 가진 로거를 찾을 수 없습 니다.
   at NeoDEEX.Diagnostics.FoxLogManager.GetLogger(String name)
   at NeoDEEX.Diagnostics.FoxLogManager.GetLogger(Type type)
   at NeoDEEX.Diagnostics.FoxLogManager.GetLogger[T]()```
   ......

Warning

대체 로거는 대부분의 상황에서 로깅 구성 설정을 손쉽게 해주며 로그 관리를 쉽게 해주는 기능이므로 문제 해결 시에만 false 로 지정하고 문제가 해결이 되면 다시 true 값으로 원상 복구 하는 것이 좋습니다.

예외를 무시하는 로거

많은 경우 로거들이 로그를 기록하면서 발생하는 예외는 무시합니다. 로그 기록으로 인해 어플리케이션이 중단되는 상황이 로그가 기록되지 않는 상황보다 심각하기 때문입니다. Fox Logging 에서 제공되는 로거들 중 FoxTextFileLogger 클래스 FoxDbLogger 클래스 역시 마찬가지 입니다.

FoxTextFileLogger 의 경우 예외가 연속적으로 3회 이상 발생하면 모든 로그를 디버거에 기록하도록 로그 재지정을 수행하고 해당 내용을 SafeLogger 에 기록합니다. SafeLogger%TEMP%/FoxLog 폴더에 로그 파일을 생성하므로 해당 파일을 검토하고 오류 원인을 파악하십시요.

FoxDbLogger 는 기본 구성 상 비동기적으로 로그를 데이터베이스에 기록하기 때문에 발생하는 오류를 모두 무시하고 오류 내용을 SafeLogger 에 기록합니다. 따라서 데이터베이스에 로그가 기록되지 않는다면 %TEMP%/FoxLog 폴더에서 로그 파일을 검토해 보십시요.

의도하지 않는 로거에 로그가 기록됨

로거 이름 레벨링 문제

앞서 언급한 로거 이름 레벨링 기능은 로그가 기록될 어플리케이션 영역을 제어하는 데에는 도움이 되지만 복잡한 구성 설정으로 인해 로그가 기록되지 않는 현상의 원인을 파악하는데 어려움을 겪을 수 있습니다. 특히 로거 이름에 오타가 발생했을 때 입니다.

예를 들어 다음과 같은 구성 설정이 존재할 때 위 코드는 콘솔에 로그가 기록되지 않고 디버거에 로그가 기록됩니다. 로그가 기록되지 않는 것이 아니라 의도하지 않은 다른 로거에 로그가 기록되는 것입니다. 이 경우 "useFallbakLogger" 속성을 false 로 지정하는 것은 도움이 되지 않습니다.

{
  "logging": {
    "loggers": {
      "HR": {
        "providerType": "NeoDEEX.Diagnostics.Loggers.FoxDebugLoggerProvider"
        "filter": "Verbose"
      },
      "HR.Salery.SalaryService": {
        "providerType": "NeoDEEX.Diagnostics.Loggers.FoxConsoleLoggerProvider"
        "filter": "Verbose"
      }
    }
  }
}

이 경우 logging:useNExactLoggerame 속성을 true 로 지정하면 로거 이름 레벨링 기능이 중지되며 FoxLogManager 클래스는 GetLogger 메서드에 전달된 로거 이름 매개변수와 정확히 일치되는 로거만을 찾으며 발견하지 못한 경우 즉시 예외를 발생 시킵니다.