Skip to content

Fox Logging Overview

Fox Logging은 NeoDEEX에서 제공하는 로깅 인프라입니다. NeoDEEX를 사용하는 어플리케이션은 Fox Logging을 통해 빠르고 유연한 로그를 남길 수 있으며, Fox Biz Service, Fox Data Service 등과 같은 NeoDEEX의 다른 기능들이 의존하는 기능이기도 합니다.

Concept & Basic Usage

Fox Logging을 사용하는 어플리케이션은 IFoxLog 인터페이스를 통해 로그 기록하게 됩니다. IFoxLog 인터페이스를 구현하여 로그를 실제적으로 기록하는 작업은 로거(logger)라 불리는 객체가 담당합니다. 예를 들어 디버거에 로그를 기록하는 FoxDebugLogger 클래스는 IFoxLog 인터페이스를 구현합니다.

로거 객체는 어플리케이션 코드에 의해 직접 생성될 수도 있지만 대부분의 경우, 구성 설정을 통해 생성되게 됩니다. 구성 설정으로부터 로거들의 목록을 읽어들여 로거들을 생성하여 등록하는 역할을 FoxLogManager 클래스가 담당합니다.

FoxLogManager 는 각 로거를 생성하고 초기화하는 방법에 대해 알지 못합니다. 따라서 로거를 생성하고 초기화하는 방법을 알고 있는 로거 프로바이더(logger provider)가 사용됩니다. FoxLogManager는 구성 설정으로부터 로거 프로바이더를 획득하고 로거 프로바이더가 구현하는 IFoxLoggerProvider 인터페이스를 통해 로거 생성을 수행하며 이렇게 생성된 로거들의 목록을 유지하게 됩니다.

Fox Logging 개요

어플리게이션은 FoxLogManager 클래스의 GetLogger 메서드를 호출하여 IFoxLog 인터페이스를 획득하고 로그를 기록할 수 있게 됩니다.

IFoxLog log = FoxLogManager.GetLogger("MyLogger");
log.Write(FoxLogLevel.Information, "This is log entry.");

이제 사용자는 Fox Logging 구성 설정을 통해 어플리케이션이 사용하는 MyLogger로 어떤 로거를 사용할지 지정할 수 있습니다. 예를 들어, 다음과 같이 neodeex.config.json 파일을 구성하면 FoxLogManagerMyLogger를 생성할 때 FoxConsoleLoggerProvider를 통해 FoxConsoleLogger 인스턴스를 생성합니다. 따라서 위 코드는 로그를 콘솔 창에 출력하게 됩니다.

{
  "logging": {
    "loggers": {
      "MyLogger" : {
        "providerType": "NeoDEEX.Diagnostics.Loggers.FoxConsoleLoggerProvider",
        "filter": "Information"
      }
    }
  }
}

한편, 코드를 변경하지 않고 구성 설정에서 MyLogger의 로거 설정을 다음과 같이 바꾸면 이제 디버거에 로그 메시지를 출력하게 됩니다.

{
  "logging": {
    "loggers": {
      "MyLogger" : {
        "providerType": "NeoDEEX.Diagnostics.Loggers.FoxDebugLoggerProvider",
        "filter": "Information"
      }
    }
  }
}

Features

  • 기본 로거 및 커스텀 로거

    • Fox Logging은 FoxConsoleLogger, FoxDebugLogger, FoxTextFileLogger, FoxEventLogLogger, FoxDbLogger 등의 로거를 기본적으로 제공합니다. 이들 로거를 통해 콘솔, 디버거, 텍스트 파일, DB에 로그를 기록할 수 있습니다.

      Note

      FoxDbLogger 클래스는 DB에 로그를 기록하므로 DB 기능이 구현된 NeoDEEX.Data 어셈블리에 포함되어 있습니다. 한편, FoxEventLogLogger 클래스는 Windows 플랫폼에 의존적이므로 NeoDEEX.Core 어셈블리에 포함되지 않고, NeoDEEX.Extensions 어셈블리에 포함되어 있습니다.

    • IFoxLog 인터페이스를 직접 구현하거나 FoxLoggerBase 클래스에서 파생된 클래스를 구현하여 커스텀 로거를 작성 할 수 있습니다.

    • IFoxLogProvider 인터페이스를 직접 구현하거나 FoxLoggerProviderBase 클래스에서 파생된 클래스를 구현하여 커스텀 로거 프로바이더를 작성할 수 있습니다.

  • 대체(Fallback) 로거

    • FoxLogManagerGetLogger 메서드 호출 통해 로거를 찾을 수 없는 경우 대체 로거를 반환합니다. 대체 로거는 FoxDummyLogger 클래스로서 매우 빠르게 로그 메시지를 필터링합니다.

      Note

      FoxDummyLogger 는 초당 40만개 이상의 로그 메시지를 필터링하므로 이 로거에 기록하는 코드가 유발하는 성능 저하는 매우 미미 합니다.

    • 대체 로거를 통해 개발 시 디버깅, 문제해결을 위해 로그를 기록하는 코드를 삭제하지 않고 유지하고, 필요에 따라 로그 구성을 추가하여 로그를 기록하도록 할 수 있습니다.

  • 로거 이름 레벨링

    • FoxLogManager 클래스의 GetLogger 메서드는 등록된 로거를 찾을 때 로거의 이름에 대해 네임스페이스와 유사한 이름 레벨링 기능을 제공합니다. 예를 들어 사용자가 MyDomain.MyLogger 라는 이름의 로거를 요청한 경우, FoxLogManagerMyDomain.MyLogger 라는 이름의 로거를 찾고 존재하지 않는 경우 MyDomain 이라는 이름의 로거를 찾습니다. 로거 이름 레벨링을 활용하는 방법은 로거 이름 레벨링 문서를 참조 하십시요.

    • 로거 이름 레벨링을 통해 어플리케이션의 특정 영역에 대해 로그를 남기거나 그렇지 않도록 조절할 수 있습니다. 구체적인 예는 로거 이름 레벨링 예제 코드를 참조 하십시요.

  • 문제 해결 도구

    • Fox Logging이 제공하는 대체 로거나 로거 이름 레벨링 기능으로 인해 대부분의 경우 FoxLogManager.GetLogger 메서드는 예외를 유발하거나 null을 반환하지 않습니다. 이는 역시 로깅에서 발생할 수 있는 다양한 문제들의 해결을 어렵게 만듭니다. 따라서 Fox Logging은 로깅 상황에서 문제를 발견하고 해결할 수 있도록 대체 로거 기능이나 로거 이름 레벨링 기능을 사용하지 않도록 하는 옵션을 제공합니다.
  • 커스텀 로거

    • Fox Logging 이 기본적으로 제공하는 로거 이외에도 IFoxLog 인터페이스, IFoxLoggerProvider 인터페이스를 구현하는 커스텀 로거를 작성하여 사용할 수도 있습니다.

    • Fox Logging 은 커스텀 로거 작성을 용이하게 해주는 FoxLoggerBase, FoxLoggerProviderBase 클래스를 제공합니다.

Loggers

로거는 IFoxLog 인터페이스를 구현하는 객체로서 로그를 다양한 매체에 기록합니다. 다음은 Fox Logging 이 기본적으로 제공하는 로거들 입니다.

  • FoxDummyLogger

    모든 로그를 빠르게 필터링하는 로거입니다. 이 로거는 대체 로거(fallback logger)로 사용됩니다.

  • FoxDebugLogger

    디버거에 로그 메시지를 출력합니다. 디버거가 구동하고 있지 않더라도 DebugView와 같은 다양한 유틸리티를 통해 디버그 메시지를 확인할 수 있습니다.

  • FoxConsoleLogger

    콘솔 창에 로그 메시지를 출력합니다. 콘솔 창을 가지고 있는 어플리케이션에서는 로그 메시지를 확인할 수 있지만 WinForm 과 같이 콘솔 창을 제공하지 않는 경우 로그 메시지를 확인할 수 없습니다.

  • FoxTextFileLogger

    텍스트 파일에 로그를 기록합니다. 텍스트 파일 로거는 높은 성능과 다양한 기능을 제공하기 때문에 대부분의 어플리케이션에서 주력으로 사용하는 로거 입니다.

  • FoxEventLogLogger

    Windows 이벤트 로그에 로그 메시지를 기록합니다. Windows 플랫폼에서만 사용이 가능한 로거 입니다.

  • FoxDbLogger

    데이터베이스에 로그를 기록합니다. 데이터베이스에 로그를 기록하기 때문에 성능은 높지 않지만 로그를 중앙 집중적으로 관리할 수 있기 때문에 활용도가 높습니다. NeoDEEX 의 다른 기능들이 데이터를 기록하기 위해 이 로거를 활용하기도 합니다.

Logger Providers

FoxConsoleLoggerFoxDebugLogger와 같은 간단한 로거의 경우 로거 프로바이더가 로거를 생성하는 것이 복잡하지 않습니다. 하지만 FoxTextFileLogger와 같은 로거는 로그 파일의 이름, 로그 파일이 생성될 디렉터리 등을 지정해주어야 합니다. 이렇게 복잡한 로거를 생성하고 설정을 수행하는 팩터리 역할을 로거 프로바이더가 수행합니다. 다음은 FoxTextFileLoggerProvider를 사용하여 FoxTextFileLogger의 파일명, 디렉터리 명을 설정을 하는 예를 보여 줍니다.

{
  "logging": {
    "providers": {
      "MyLoggerProvider": {
        "providerType": "NeoDEEX.Diagnostics.Loggers.FoxTextFileLoggerProvider",
        "properties": {
          "filePrefix": "MyLog",
          "directory": "~/Logs"
        }
      }
    },
    "loggers": {
      "MyLogger" : {
        "providerName": "MyLoggerProvider",
        "filter": "Information"
      }
    }
  }
}

위 예제 구성 설정에서는 MyLoggerProvider 라는 이름의 FoxTextFileLoggerProvider를 등록하고, 로거 생성 시 사용할 로거 속성들(filePrefix, directory 등)을 설정합니다. FoxLogManager는 구성 설정에서 loggers 섹션을 읽을 때 providerName 속성으로부터 로거 프로바이더를 찾을 수 있으며, 로거 프로바이더에게 로거 속성들을 전달하여 로거를 생성하도록 합니다. 생성된 로거는 FoxLogManager에 등록되며 GetLogger 호출 시 반환되게 됩니다.


Fox Logging 관련 예제 코드들은 다음 코드들을 참고 하십시요.