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
인터페이스를 통해 로거 생성을 수행하며 이렇게 생성된 로거들의 목록을 유지하게 됩니다.
어플리게이션은 FoxLogManager
클래스의 GetLogger
메서드를 호출하여 IFoxLog
인터페이스를 획득하고 로그를 기록할 수 있게 됩니다.
IFoxLog log = FoxLogManager.GetLogger("MyLogger");
log.Write(FoxLogLevel.Information, "This is log entry.");
이제 사용자는 Fox Logging 구성 설정을 통해 어플리케이션이 사용하는 MyLogger
로 어떤 로거를 사용할지 지정할 수 있습니다. 예를 들어, 다음과 같이 neodeex.config.json
파일을 구성하면 FoxLogManager
가 MyLogger
를 생성할 때 FoxConsoleLoggerProvider
를 통해 FoxConsoleLogger
인스턴스를 생성합니다. 따라서 위 코드는 로그를 콘솔 창에 출력하게 됩니다.
한편, 코드를 변경하지 않고 구성 설정에서 MyLogger
의 로거 설정을 다음과 같이 바꾸면 이제 디버거에 로그 메시지를 출력하게 됩니다.
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
클래스에서 파생된 클래스를 구현하여 커스텀 로거 프로바이더를 작성할 수 있습니다.
-
-
-
FoxLogManager
는GetLogger
메서드 호출 통해 로거를 찾을 수 없는 경우 대체 로거를 반환합니다. 대체 로거는FoxDummyLogger
클래스로서 매우 빠르게 로그 메시지를 필터링합니다.Note
FoxDummyLogger 는 초당 40만개 이상의 로그 메시지를 필터링하므로 이 로거에 기록하는 코드가 유발하는 성능 저하는 매우 미미 합니다.
-
대체 로거를 통해 개발 시 디버깅, 문제해결을 위해 로그를 기록하는 코드를 삭제하지 않고 유지하고, 필요에 따라 로그 구성을 추가하여 로그를 기록하도록 할 수 있습니다.
-
-
-
FoxLogManager
클래스의GetLogger
메서드는 등록된 로거를 찾을 때 로거의 이름에 대해 네임스페이스와 유사한 이름 레벨링 기능을 제공합니다. 예를 들어 사용자가MyDomain.MyLogger
라는 이름의 로거를 요청한 경우,FoxLogManager
는MyDomain.MyLogger
라는 이름의 로거를 찾고 존재하지 않는 경우MyDomain
이라는 이름의 로거를 찾습니다. 로거 이름 레벨링을 활용하는 방법은 로거 이름 레벨링 문서를 참조 하십시요. -
로거 이름 레벨링을 통해 어플리케이션의 특정 영역에 대해 로그를 남기거나 그렇지 않도록 조절할 수 있습니다. 구체적인 예는 로거 이름 레벨링 예제 코드를 참조 하십시요.
-
-
- Fox Logging이 제공하는 대체 로거나 로거 이름 레벨링 기능으로 인해 대부분의 경우
FoxLogManager.GetLogger
메서드는 예외를 유발하거나null
을 반환하지 않습니다. 이는 역시 로깅에서 발생할 수 있는 다양한 문제들의 해결을 어렵게 만듭니다. 따라서 Fox Logging은 로깅 상황에서 문제를 발견하고 해결할 수 있도록 대체 로거 기능이나 로거 이름 레벨링 기능을 사용하지 않도록 하는 옵션을 제공합니다.
- Fox Logging이 제공하는 대체 로거나 로거 이름 레벨링 기능으로 인해 대부분의 경우
-
-
Fox Logging 이 기본적으로 제공하는 로거 이외에도
IFoxLog
인터페이스,IFoxLoggerProvider
인터페이스를 구현하는 커스텀 로거를 작성하여 사용할 수도 있습니다. -
Fox Logging 은 커스텀 로거 작성을 용이하게 해주는
FoxLoggerBase
,FoxLoggerProviderBase
클래스를 제공합니다.
-
Loggers¶
로거는 IFoxLog
인터페이스를 구현하는 객체로서 로그를 다양한 매체에 기록합니다. 다음은 Fox Logging 이 기본적으로 제공하는 로거들 입니다.
-
FoxDummyLogger
모든 로그를 빠르게 필터링하는 로거입니다. 이 로거는 대체 로거(fallback logger)로 사용됩니다.
-
FoxDebugLogger
디버거에 로그 메시지를 출력합니다. 디버거가 구동하고 있지 않더라도 DebugView와 같은 다양한 유틸리티를 통해 디버그 메시지를 확인할 수 있습니다.
-
FoxConsoleLogger
콘솔 창에 로그 메시지를 출력합니다. 콘솔 창을 가지고 있는 어플리케이션에서는 로그 메시지를 확인할 수 있지만 WinForm 과 같이 콘솔 창을 제공하지 않는 경우 로그 메시지를 확인할 수 없습니다.
-
텍스트 파일에 로그를 기록합니다. 텍스트 파일 로거는 높은 성능과 다양한 기능을 제공하기 때문에 대부분의 어플리케이션에서 주력으로 사용하는 로거 입니다.
-
Windows 이벤트 로그에 로그 메시지를 기록합니다. Windows 플랫폼에서만 사용이 가능한 로거 입니다.
-
FoxDbLogger
데이터베이스에 로그를 기록합니다. 데이터베이스에 로그를 기록하기 때문에 성능은 높지 않지만 로그를 중앙 집중적으로 관리할 수 있기 때문에 활용도가 높습니다. NeoDEEX 의 다른 기능들이 데이터를 기록하기 위해 이 로거를 활용하기도 합니다.
Logger Providers¶
FoxConsoleLogger
나 FoxDebugLogger
와 같은 간단한 로거의 경우 로거 프로바이더가 로거를 생성하는 것이 복잡하지 않습니다. 하지만 FoxTextFileLogger
와 같은 로거는 로그 파일의 이름, 로그 파일이 생성될 디렉터리 등을 지정해주어야 합니다. 이렇게 복잡한 로거를 생성하고 설정을 수행하는 팩터리 역할을 로거 프로바이더가 수행합니다. 다음은 FoxTextFileLoggerProvider
를 사용하여 FoxTextFileLogger
의 파일명, 디렉터리 명을 설정을 하는 예를 보여 줍니다.
위 예제 구성 설정에서는 MyLoggerProvider
라는 이름의 FoxTextFileLoggerProvider
를 등록하고, 로거 생성 시 사용할 로거 속성들(filePrefix
, directory
등)을 설정합니다. FoxLogManager
는 구성 설정에서 loggers
섹션을 읽을 때 providerName
속성으로부터 로거 프로바이더를 찾을 수 있으며, 로거 프로바이더에게 로거 속성들을 전달하여 로거를 생성하도록 합니다. 생성된 로거는 FoxLogManager
에 등록되며 GetLogger
호출 시 반환되게 됩니다.
Fox Logging 관련 예제 코드들은 다음 코드들을 참고 하십시요.