Log API¶
Oasis Log 기능을 통하여 응용 프로그램의 동작 상태를 확인합니다.
로그 API를 이용하여 로그 출력 양식을 수정하거나 로그 기록 대상 방식을 수정할 수 있습니다.
Oasis Log 기본 설정은 아래와 같습니다.
| 항목 | 기본값 |
설명 |
|---|---|---|
| 콘솔 출력 | true | 로그 메세지는 콘솔에 출력됩니다. 로그 서버가 활성화됩니다. |
| 리디렉트 | false | 로그 파일로 메세지를 리디렉트하려면 logToRotateFiles를 호출합니다. |
| ANSI Color 코드 | true | 터미널 ANSI Escape를 지원합니다. |
| 시스템 타임스탬프 | true | 시스템 시작부터 단순증가하는 타이머 값을 각 로그 메세지의 헤더로 출력합니다. |
| 로컬 시간 | false | 로컬 시간을 로그 메세지 헤더로 출력하지 않습니다. |
| 파일 함수와 파일 줄 번호 표시 | true | 로그 메세지 출력시 해당 함수 이름과 줄번호를 출력합니다. |
| 플러쉬 인터벌 | 5초 | 로그 메세지를 5초 간격으로 플러쉬합니다. |
Note
Oasis 일반 로그 메세지의 텍스트 색상은 흰색입니다. 콘솔의 배경색을 어두운 색(검정색 등)으로 설정할 것을 권장합니다.
헤더 파일¶
OasisAPI.h
OasisLog.h
로그 매크로¶
응용 프로그램은 OasisLog.h 에 정의되어 있는 매크로 함수를 이용하여 로그 출력을 합니다.
DLOG(condition, fmt, ...)
condition에 맞으면 DLOG_TAG를 포함한 로그 메세지를 출력합니다.DLOG0(condition, fmt, ...)
condition에 맞으면 DLOG_TAG를 포함한 로그 메세지를 출력합니다. 함수이름과 줄번호는 포함되지 않습니다.TLOG(condition, tag, fmt, ...)
condition에 맞으면 tag를 포함한 로그 메세지를 출력합니다.TLOG0(condition, tag, fmt, ...)
condition에 맞으면 tag를 포함한 로그 메세지를 출력합니다. 함수이름과 줄번호는 포함되지 않습니다.TRACE(fmt, ...)
흰색 글자색으로 로그 메세지를 출력합니다.TRACE0(fmt, ...)
TRACE0로 전달된 메세지만 출력합니다. 시간정보 등등 모두 포함되지 않습니다.TRACE1(fmt, ...)
TRACE1로 전달된 메세지와 시간정보만 출력합니다.ASSERT(condition)
condition에 맞지 않으면 DLOG_TAG를 포함한 condition 메세지를 출력합니다. 함수명과 줄번호는 항상 포함됩니다.ASSERT0(condition, fmt, ...)
condition에 맞지 않으면 DLOG_TAG를 포함한 condition과 로그 메세지를 출력합니다. 함수명과 줄번호는 항상 포함됩니다.DUMP(msg, data, size)
msg를 첫줄에 출력하고, data를 Hex+Ascii 방식으로 출력합니다.DUMP2(msg, data, size, realsize)
msg를 첫줄에 출력하고, data를 Hex+Ascii 방식으로 출력합니다. size는 realsize보다 작을 수 있습니다.
DLOG, DLOG0, TLOG, TLOG0의 condition 체크는 아래와 같습니다.
// DLOG_FLAGS를 소스 파일 내에 정의합니다.
if (((condition)&DLOG_FLAGS) != 0) {
//로그 출력
}
아래 표는 각 매크로 함수가 Log API를 통해 로그 메세지에 적용될 항목이 활성화/비활성화 되었을 때 영향을 받는지 유무를 정리한 것입니다. 비어 있는 칸은 해당 항목을 사용하지 않음을 의미합니다.
| 매크로\항목 | 시스템 타임스탬프 | 로컬 시간 | ANSI 코드 | 함수명과 줄번호 |
|---|---|---|---|---|
| DLOG | ◯ | ◯ | ◯ | ◯ |
| TLOG | ◯ | ◯ | ◯ | ◯ |
| DLOG0 | ◯ | ◯ | ◯ | |
| TLOG0 | ◯ | ◯ | ◯ | |
| TRACE | ◯ | ◯ | △ | ◯ |
| TRACE0 | ||||
| TRACE1 | ◯ | ◯ | ||
| ASSERT | ◯ | ◯ | ◯ | 항상 |
| ASSERT0 | ◯ | ◯ | ◯ | 항상 |
Note
TRACE의 경우, ANSI 코드가 활성화되면 글자색을 흰색으로 처리합니다. ANSI 코드가 비활성화되면 현재 글자 색상을 사용합니다. ASSERT와 ASSERT0의 경우, 함수명과 줄번호는 항상 로그 메세지에 포함됩니다.
로그 매크로 사용법¶
Oasis 로그를 응용 프로그램에 사용하려면 OasisLog.h 파일을 포함시킵니다.
#include "OasisLog.h"
condition 별로 로그를 출력하거나 태그를 포함하여 출력하려면 DLOG_FLAGS와 DLOG_TAG를 정의합니다.
#undef DLOG_TAG
#define DLOG_TAG "사용하려는 태그 이름"
#define DLOG_THIS 0x00080000
#undef DLOG_FLAGS
#define DLOG_FLAGS (DLOG_FLAGS_DEFAULT|DLOG_THIS/**/)
DLOG_FLAGS_DEFAULT 는 아래와 같은 값으로 구성되어 있습니다.
#define DLOG_COLOR2 0x00000200
#define DLOG_COLOR1 0x00000100
#define DLOG_SIGNAL 0x00000080
#define DLOG_FATAL 0x00000040
#define DLOG_ASSERT 0x00000020
#define DLOG_ERROR 0x00000010
#define DLOG_WARN 0x00000008
#define DLOG_INFO 0x00000004
#define DLOG_DEBUG 0x00000002
#define DLOG_VERBOSE 0x00000001
#define DLOG_F_NOFILEINFO 0x8000000000000000ull
#define DLOG_F_NOFUNCINFO 0x4000000000000000ull
#define DLOG_F_ENAB1BYAPI 0x2000000000000000ull //toggled by api
#define DLOG_F_ENAB2BYAPI 0x1000000000000000ull //toggled by api
#define DLOG_FLAGS_DEFAULT (DLOG_F_ENAB2BYAPI \
| DLOG_F_ENAB1BYAPI \
| DLOG_F_NOFILEINFO \
| DLOG_F_NOFUNCINFO \
| DLOG_INFO \
| DLOG_ERROR \
| DLOG_WARN \
| DLOG_ASSERT \
| DLOG_FATAL/*|DLOG_SIGNAL*/)
각 플래그에 대한 ANSI 색상은 아래와 같습니다.
| DLOG_FLAG | 색상 |
|---|---|
| DLOG_ERROR | 빨간색 |
| DLOG_WARN | 녹색 |
| DLOG_INFO | 노란색 |
| DLOG_COLOR1 | 파란색 |
| DLOG_COLOR2 | 보라색 |
| DLOG_SIGNAL | 청록색 |
| 기타 | 흰색 |
그런 다음 코드에서 로그 매크로를 사용합니다.
#include "OasisLog.h"
#undef DLOG_TAG
#define DLOG_TAG "MYAPP"
#define DLOG_THIS 0x00080000
#undef DLOG_FLAGS
#define DLOG_FLAGS (DLOG_FLAGS_DEFAULT|DLOG_THIS/**/)
void function()
{
int32_t value = 0;
char data[256] = { 0, };
for(int32_t i=0; i<256; i++) {
data[i] = (i%256);
}
DLOG(DLOG_INFO, "info message...\n");
DLOG(DLOG_THIS, "value = %d\n", value);
DLOG0(DLOG_THIS, "value = %d\n", value);
TLOG(DLOG_THIS, "new tag name", "value = %d\n", value);
TRACE0("always printed\n");
ASSERT(value == 1);
ASSERT0(value == 1, ": %d == 1\n", value);
DUMP2("myapp-data", data, 16, 256);
}
콘솔 로그 출력은 아래와 같습니다.
[89511.647264] Info: [MYAPP] function()@hello.cpp:75: info message...
[89511.647307] [MYAPP] function()@hello.cpp:76: value = 0
[89511.647326] value = 0
[89511.647341] [new tag name] function()@hello.cpp:78: value = 0
[89511.647366] MYAPP: ASSERT hello.cpp@81 function: value == 1
[89511.647380] MYAPP: ASSERT hello.cpp@82 function: value == 1 : 0 == 1
myapp-data, __data=0xffffc47b62f8, __size=16 of 256:
00000000 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f ................
함수¶
- 0: 성공
- -1: 실패
- 0: 성공
- -1: 실패
예제¶
아래는 로그 환경 방식을 수정한 예입니다.
using namespace oasis;
// Oasis 로그를 설정합니다.
if(run_in_background) {
//백그라운로 동작시에는 로그를 파일에 저장합니다.
logToRotateFiles("/var/log/myapp-oasis-%d.log", 128*1024*2, 10);
enableLogAnsiEscapes(true);
enableLogLocalTime(true);
enableLogSourceFileFuncLineInfo(false);
setLogFlushInterval(0);
} else {
setLogOutToStdOut(true);
enableLogLocalTime(true);
enableLogMonolithicTime(false);
}
// Oasis를 초기화 합니다.
oasis::initialize(parameters);