2009년 11월 5일 목요일

Log Class 설계

● 클래스:Log Class 설계

현재 상태를 사용자에게 정확하고 자세하게 알려줄 수 있는 유일한 도구이다.

 

로그라는 특성상 어느 곳에서든지 사용하기 편하도록 Singleton클래스를 상속받아 전역 단일체 클래스로 만들자

 

로그를 필요한 때에 남기지 못하고 또 정확하게 남기지 못하면 서버가 제대로 동작하고 있는지, 문제는 없는지에 대한 정보를 정확하게 파악할 수 없다.

 

체계 없이 남겨진 로그 정보는 실제 필요한 로그를 찾는데 시간이 오래 걸 릴 뿐만 아니라 그게 대한 정보가 부족해 결국 시스템 부하만 줄 뿐 기능상으로는 유명무실해 진다.

 

1. Log 클래스의 종류를 나누자

- 알림오류로 나눠 자신이 원하는 정보를 보다 빨리 찾을 수 있도록 설계 하고

2. Log 클래스의 중요도를 나누자

- 각 종류마다 중요도 LOW, NORMAL, HIGH, CRITICAL등 등급을 나누어 쉽게 정보의 중요성을 파악할 수 있게 하자

2-1. 아래 나와 있는 enumLogInfoType은 Log클래스에서 사용할 로그 정보의 분류를 나열한 것이다

enum enumLogInfoType

{

    LOG_NONE= 0x00000000,

    LOG_INFO_LOW= 0x00000001,

    LOG_INFO_NORMAL= 0x00000002,

    LOG_INFO_HIGH= 0x00000004,

    LOG_INFO_CRITICAL= 0x00000008,

    LOG_INFO_ALL= 0x0000000F,

    LOG_ERROR_LOW= 0x00000010,

    LOG_ERROR_NORMAL= 0x00000020,

    LOG_ERROR_HIGH= 0x00000040,

    LOG_ERROR_CRITICAL= 0x00000080,

    LOG_ERROR_ALL= 0x00000100,

    LOG_ALL= 0x000001FF

};

각 등급마다 16진수로 설정하고 OR 연산을 할 수 있도록 2의n승으로 증가시킨다.

- 로그를 저장할 매체 : 파일, 출력 창, 윈도우, DB, TCP, UDP로 분류

enum enumLogStorageType

{

    STORAGE_F ILE= 0x00000000,

    STORAGE_DB= 0x00000001,

    STORAGE_WINDOW= 0x00000002,

    STORAGE_OUTPUTWND= 0x00000003,

    STORAGE_UDP= 0x00000004,

    STORAGE_TCP= 0x00000005

};

위의 enumLogStorageType은 로그를 저장할 매체에 대한 선언이다.

 

로그의 부하로 인해 속도에 문제가 생길 수 있기 때문에 최소한의 처리(로그를 내부 Queue에 넣고 바로 반환)만 하고 내부적으로 틱 쓰레드를 사용하여 일정 시간마다 Queue에 들어있던 로그를 가져와 처리하도록 한다.

서비스 할 때에는 로그를 최소한으로 하여 사용해야 한다.

 

 

3.로그를 남기는 시점

3-1. 에러 로그의 경우 모든 경우에 로그로 남긴다.

- 쉽게 넘긴 작은 에러 하나가 정말 큰 버그를 부른다.

3-2. 일반적인 정보 로그의 경우

- 함수 시작 부분과 모든 패킷 처리 시작 부분에 남기는 것이 좋다.

- 이유는 만약 어떤 처리를 하다 이유 없이 서버 프로세스가 죽었을 경우에 쉽게 그 위치를 파악할 수 있다.

- 모든 함수와 패킷에서 로그를 남긴다면 실제 서비스할 때에는 엄청난 부하가 생길 것이다. 그래서 앞에서 정한 등급에 따라 일정 등급 이하의 정보를 로그로 남기지 않거나 정보 관련 로그는 아예 남기지 않도록 할 수 있다.

 

4.무엇을 로그로 남길 것인가

4-1. 로그가 어떤 함수에서 남겨졌는지 알아야 한다.

4-2. 누구에 의해서 로그가 남겨졌는지를 알아야 한다.

- 시스템일수도 있고 패킷을 받아 남기는 것이라면 패킷을 보낸 해당 클라이언트가 될 수도 있다.

4-3. 로그가 발생되는 시간을 남겨야한다.

4-4. 로그의 종류가 에러라고 하면 에러가 어떤 작업을 하다가 발생한 것인지 남겨야하고 종류가 알림이라면 함수의 인자나 받은 패킷의 프로토콜 내용을 남겨야 한다.

댓글 없음:

댓글 쓰기