고수들이 절대 가르쳐 주지 않는 C/C++ 프로그래밍 팁 #5 - 로깅 라이브러리 요구 사항

Posted at 2007. 7. 23. 15:00 // in S/W개발/고절가주팁 // by 김윤수


고절가주팁 다섯번째 글입니다. 저번 글에서는 로깅 라이브러리를 구현하기 위한 기본적인 지식을 소개해 드렸습니다. 지난 글에서 소개한 팁을 다시 소개하자면,

  1. 매크로 함수 정의에서 인자 x 에 대해 #x 라고 쓰면 x 가 문자열 리터럴로 바뀝니다.
  2. __FUNCTION__ 또는 __func__ 는 현재 함수명을 출력하는 데 사용할 수 있습니다. 단, __FUNCTION__, __func__ 모두 portability 측면에서 약간 문제가 있으므로 주의해서 사용해야 합니다.
  3. __FILE__ 은 현재 파일명을 출력하는 데 사용할 수 있습니다.
  4. __LINE__ 은 현재 라인번호를 출력하는 데 사용할 수 있습니다.
  5. 조건부 컴파일을 이용해서 디비깅용 빌드와 Production 빌드를 구분하는 방법을 사용할 수 있어야 합니다.
  6. 컴파일러 옵션 중 preprocessing 만 하는 옵션을 알아두면 매크로 함수를 디비겅하는데 유용하게 사용될 수 있습니다(GCC 에서는 -E).

이 지식은 일단 가슴 속에 담아 두고, 이번 글에서는 로깅 라이브러리 요구사항을 한 번 정리해 보도록 하겠습니다.

여러분이 일상적인 프로그래밍을 하면서 디버깅 정보 또는 프로그램 실행 정보를 출력할 때 가장 필요로 하는 것이 어떤 것인가요 ? 제가 생각하기에 로깅의 가장 기본적인 목적은 첫번째로 개발자 입장에서 생각한다면 문제점을 빨리 파악해서 디버깅을 쉽게하기 위한 것이라고 생각합니다. 디버깅을 쉽게 하려면 가장 먼저 필요한 것이 어떤 모듈, 어떤 소스 파일의 어느 함수, 어느 위치에서 문제점을 발생했는지를 알아야할 필요가 있겠지요.

두번째로 로깅 정보가 화면으로도 출력되고, 파일로도 저장되고, 어떤 때는 원격 로깅 목적지로도 전송되는 등 여러 목적지로 보낼 수 있으면 좋을 것 같습니다. 화면으로만 출력된다면 개발 단계에서는 도움이 되겠지만, 릴리즈 단계에서는 화면에 너무 많은 정보가 출력되는게 좋지 않을 것이기 때문입니다. 그리고, 원격지에서 중앙 집중식으로 여러 서버의 로깅 정보를 수집하고자 하는 경우도 있으므로 로깅 정보를 원격 목적지로 보낼 수 있다면 좋을 것입니다.

세번째로 모듈별로 로깅을 활성화시키거나 비활성화시키거나 할 수 있으면 좋을 것입니다. 이렇게 하면 문제점을 파악해 갈 때 점점 범위를 좁혀 가면서 작업할 수 있기 때문입니다.

네번째로 로깅을 얼마나 상세하게 할 것인지 조정할 수 있는 기능이 있으면 좋을 것입니다. 이렇게 하면 평소에는 대략적인 정보만 로깅하다가 어떤 문제점이 발생했을 때, 로깅을 상세하게 함으로써 문제점을 빨리 파악하는 데 도움이 될 것이기 때문입니다.

다섯번째로 개발단계에서만 출력할 필요가 있는 아주 상세한 디버깅 정보들은 Production 단계에서는 자동으로 코드에서 없어지면 좋을 것입니다. 이렇게 하면 프로그램 수행 성능과 코드 크기 측면에서 모두 이득이 될 것이기 때문입니다.

여섯번째로 모듈별 로깅의 활성화나 로깅 수준은 프로그램 실행 중에도 변경할 수 있으면 좋을 것입니다. 이렇게 하면 프로그램을 종료시키지 않은 채로 문제점을 찾을 수 있을 것입니다.

제가 생각하는 로깅 라이브러리의 요구 사항은 이 정도입니다. 로깅 라이브러리 요구 사항이 이 정도로 많은 줄 모르셨다구요 ? 그러게 말입니다. 저도 프로그래밍 초짜 시절에는 그냥 printf() 로 찍으면 되지 뭐~ 그렇게 생각했습니다. 근데 이런 저런 프로젝트를 하다 보니 이런 요구사항을 만족하는 로깅 라이브러리가 있으면 좋겠다는 생각이 많이 들더군요. 이 외에도 생각나는 요구사항이 있으시면 한 번 댓글이나 트랙백 날려 주시면 감사하겠습니다.

그럼 위와 같은 요구사항을 만족하는 로깅 라이브러리의 인터페이스는 어떻게 작성하면 좋을까요 ? 이번 글은 요구사항을 정리해보는 것으로 마무리하고, 다음 글에서 본격적으로 로깅 라이브러리의 인터페이스를 설계해 보도록 하겠습니다. 여러분도 한 번 위와 같은 요구사항을 만족하는 로깅 라이브러리의 인터페이스를 나름대로 설계해 보시면 좋을 것 같습니다.

고절가주팁이 쭉~ 갈 수 있도록 많은 관심 부탁드리고, 혹시 잘못된 부분이나 보완할 부분이 있으면 언제라도 알려주세요.

제 글이 유익하셨다면 오른쪽 버튼을 눌러 제 블로그를 구독하세요. ->
블로그를 구독하는 방법을 잘 모르시는 분은 2. RSS 활용을 클릭하세요.
RSS에 대해 잘 모르시는 분은 1. RSS란 무엇인가를 클릭하세요.

  1. 어쩌다가..코더

    2007.07.23 22:02 [수정/삭제] [답글]

    좋은 내용입니다.
    거기에 로그의 암복호화 처리가 있으면 좋습니다.
    원격지의 로그 정보 전송 등에 암복호화된 로그를 전송하면
    보안 문제 뿐 아니라, 원격 지원 시 여러 가지(?) 유용한 면이 있습니다...

  2. 라이브

    2007.07.24 00:25 [수정/삭제] [답글]

    진짜로 이런 것들은 고수들이 절대 안 가르쳐줘요?
    아니면, 가르쳐주는데 그냥 쓴 건지?

    • 김윤수

      2007.07.24 06:14 신고 [수정/삭제]

      글쎄요... 라이브님은 어떨 것 같으세요 ? 본인이 고수라고 생각하시나요 ? 아니면 초보라고 생각하시나요 ? 반대로 제가 고수라고 생각하시나요 ? 아니면 고수인척 하는 거라고 생각하시나요 ? 제가 만약 고수라면 절대 가르쳐주지 않을 팁을 왜 가르쳐 드리고 있을까요 ?

      너무 제목에 연연해 하지 말고 읽고 도움이 되신다면 충분한 것 아닐까요 ? ^^

  3. 추링

    2007.07.24 02:41 [수정/삭제] [답글]

    좋은 내용 이네요~
    파일로 로그를 기록할때 날짜별 또는 시간별로 로그 파일을 쌓는다던지,
    로그 파일이 지정 사이즈 이상 쌓이면 파일을 새로 만들어 분리한다던지
    기능이 있으면 좋을듯 하고요,
    사실 로그를 쌓는것도 IO에 많은 부하를 주는일이라 로그를 줄일수 있는 방안(예를 들면 syslog처럼 같은 로그가 두번 쌓일때는 '같은 내용이 몇번 반복되었다'라는 로그만 출력하는 등.) 등이 추가 되면 좋을 듯 합니다.

    • 김윤수

      2007.07.24 02:45 신고 [수정/삭제]

      로그 파일을 따로 쌓는 것도 좋고, 로깅할 때 시간 정보도 기록하는 것이 좋을 것 같네요. 좋은 의견 감사합니다. 역시 제가 잘 생각하지 못했던 요구사항들이 나오네요

댓글을 남겨주세요.