티스토리 뷰

프로그래밍Tip

log debug 메시지 관련

이성권 2014. 12. 24. 16:53

유닉스, 리눅스 상에서 프로그래밍을 하다 보면, 디버그나 로그를 위해 메시지를 남겨야 할 경우가 빈번하다.

이 때, 사용해 볼 수 있는 간단한 팁이다. 이는 10여 년 전부터 사용해 오던 매크로(macro) 이다. 출력 파일로는 표준 출력(stdout)과 표준 에러(stderr)을 사용하였고, 이를 실제 파일로 리다이렉션(또는 dup() 등)하여 사용할 수 있을 것이다.

시간관련 포맷팅을 위해 strftime() 함수를 사용한 것과, __FILE__, __LINE__, __func__ 및 __VA_ARGS__를 사용한 것이 특징이다.

사용법? 아래 코드를 debug.h로 저장했다고 가정하자.

// exam.c

#inlcude "debug.h"

int main()

{

DEBUG("Hello World %d\n", 2014); // 일반적인 printf 함수의 포맷스트링을 사용

return 0;

}

//-- debug.h -------------------------------------------

#include <stdio.h>

#include <time.h>

// format is a string like as "%d %s..."

#define DEBUG(format, ...)  do {\

time_t tm_time;\

struct tm *st_time; \

char buff[1024]; \

time( &tm_time);\

st_time = localtime( &tm_time);\

strftime( buff, 1024, "DEBUG %Y-%m-%d %H:%M:%S", st_time);\

fprintf(stderr, "%s:%s:%d:%s():" format "\n", buff,__FILE__, __LINE__, __func__, ##__VA_ARGS__);}while(0)


#define INFO(format, ...)  do {\

time_t tm_time;\

struct tm *st_time; \

char buff[1024]; \

time( &tm_time);\

st_time = localtime( &tm_time);\

strftime( buff, 1024, "DEBUG %Y-%m-%d %H:%M:%S", st_time);\

fprintf(stderr, "%s:%s:%d:%s():" format "\n", buff,__FILE__, __LINE__, __func__, ##__VA_ARGS__);}while(0)


#define WARN(format, ...)  do {\

time_t tm_time;\

struct tm *st_time; \

char buff[1024]; \

time( &tm_time);\

st_time = localtime( &tm_time);\

strftime( buff, 1024, "DEBUG %Y-%m-%d %H:%M:%S", st_time);\

fprintf(stderr, "%s:%s:%d:%s():" format "\n", buff,__FILE__, __LINE__, __func__, ##__VA_ARGS__);}while(0)


#define ERROR(format, ...)  do {\

time_t tm_time;\

struct tm *st_time; \

char buff[1024]; \

time( &tm_time);\

st_time = localtime( &tm_time);\

strftime( buff, 1024, "DEBUG %Y-%m-%d %H:%M:%S", st_time);\

fprintf(stderr, "%s:%s:%d:%s():" format "\n", buff,__FILE__, __LINE__, __func__, ##__VA_ARGS__);}while(0)


// struct timeval a, b, result

// CMP <, >, ==, ...

#define TIMER_CMP(a, b, CMP) \

(((a)->tv_sec == (b)->tv_sec) ? \

((a)->tv_usec CMP (b)->tv_usec) : \

((a)->tv_sec CMP (b)->tv_sec))


#define TIMER_ADD(a, b, result) \

do { \

(result)->tv_sec = (a)->tv_sec + (b)->tv_sec; \

(result)->tv_usec = (a)->tv_usec + (b)->tv_usec; \

if ((result)->tv_usec >= 1000000) \

{ \

++(result)->tv_sec; \

(result)->tv_usec -= 1000000; \

} \

} while (0)


#define TIMER_SUB(a, b, result) \

do { \

(result)->tv_sec = (a)->tv_sec - (b)->tv_sec; \

(result)->tv_usec = (a)->tv_usec - (b)->tv_usec; \

if ((result)->tv_usec < 0) { \

--(result)->tv_sec; \

(result)->tv_usec += 1000000; \

} \

} while (0)