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 방식으로 출력합니다. sizerealsize보다 작을 수 있습니다.

DLOG, DLOG0, TLOG, TLOG0condition 체크는 아래와 같습니다.

// 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_FLAGSDLOG_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   ................

함수

int32_t logToRotateFiles ( const char * path_format , size_t max_size , int32_t max_files )
OasisAPI.h
로그 메세지를 파일로 리디렉트하여 파일에 저장합니다. path_format 에 따라 파일을 생성하며, 최대 허용 크기가 되면 새 로그 파일을 생성하여 계속 저장합니다. 로그 파일이 최대 허용 개수인 max_files 를 넘어서면 오래된 로그 파일을 지우고 덮어씁니다. 이 함수는 oasis::initialize 호출 전에 불러질 수 있습니다.
매개변수
path_format  로그 파일 생성 양식입니다. <절대경로>/<파일이름>-%d[.확장자] 형식으로 지정합니다. 예를 들어 /var/log/oasis-%d.log 과 같은 형식으로 지정합니다.
max_size  파일 당 최대 크기입니다. 바이트 단위입니다. 0 이하 값을 입력하면 -1을 리턴합니다.
max_files  최대 로그 파일 개수입니다. 0 이하 값을 입력하면 -1을 리턴합니다.
리턴값
  • 0: 성공
  • -1: 실패
void setLogFlushInterval ( uint64_t usec )
OasisAPI.h
로그 플러쉬 간격을 설정합니다. 기본값은 5초입니다.
매개변수
usec  마이크로초 단위로 설정합니다. 만일 "0" 값을 입력하면, 로그 메세지 마다 플러쉬합니다.
void flushLogs ( )
OasisAPI.h
현재 로그 메세지를 플러쉬합니다.
void shutdownLogs ( )
OasisAPI.h
로그를 종료합니다. 리디렉트 되어 있는 경우 사용 중인 파일을 닫습니다. 로그 서버가 동작 중이면 로그 서버를 중지합니다.
void enableLogAnsiEscapes ( bool enable )
OasisAPI.h
ANSI Color 코드를 적용할지 여부를 지정합니다. DLOG, DLOG0, TLOG, TLOG0, TRACE, ASSERT, ASSERT0가 영향을 받습니다.
매개변수
enable  true이면 ANSI Color 코드를 적용합니다.
void enableLogMonolithicTime ( bool enable )
OasisAPI.h
시스템 타임스탬프를 로그 메세지에 포함시킬지 여부를 지정합니다. DLOG, DLOG0, TLOG, TLOG0, TRACE, TRACE1, ASSERT, ASSERT0가 영향을 받습니다.
매개변수
enable  true이면 시스템 타임스탬프를 로그 메세지에 포함합니다.
void enableLogLocalTime ( bool enable )
OasisAPI.h
로컬 시간을 로그 메세지에 포함시킬지 여부를 지정합니다. DLOG, DLOG0, TLOG, TLOG0, TRACE, TRACE1, ASSERT, ASSERT0가 영향을 받습니다.
매개변수
enable  true이면 로컬 시간을 로그 메세지에 포함합니다.
void enableLogSourceFileFuncLineInfo ( bool enable )
OasisAPI.h
로그 메세지에 함수 이름과 파일의 줄번호를 포함시킬지 여부를 지정합니다. DLOG, TLOG, TRACE 매크로가 영향을 받습니다.
매개변수
enable  true이면 로그 메세지에 함수명과 줄번호를 포함합니다.
void setLogOutToStdOut ( bool enable )
OasisAPI.h
콘솔에 로그 메세지를 출력할지 지정합니다.
매개변수
enable  true이면 콘솔에 로그메세지를 출력합니다. 파일로 리디렉트 중이면 무시됩니다.
int32_t enableLoggerSevrer ( bool enable )
OasisAPI.h
로그 서버를 활성화할 지 여부를 지정합니다.
매개변수
enable  true이면 로그 서버를 활성화합니다. 이미 시작된 경우 -1을 리턴합니다. false이면 로그 서버를 중지합니다.
리턴값
  • 0: 성공
  • -1: 실패
const char * currentLogPath ( )
OasisAPI.h
로그를 파일로 리디렉트되어 저장할 경우, 현재 저장 중인 파일 경로입니다.
리턴값
현재 사용중인 로그 파일 경로를 리턴합니다. 리디렉트가 아닌 콘솔에 출력하는 경우에는 nullptr을 리턴합니다.
const char * currentLogServerPath ( )
OasisAPI.h
현재 로그 서버 경로를 얻습니다. 로그 서버는 Unix Domain Socket(UDS)를 사용합니다. 경로는 /tmp/oasis-logger-<pid> 형식을 갖습니다.
리턴값
현재 사용중인 로그 서버 UDS 경로를 리턴합니다.

예제

아래는 로그 환경 방식을 수정한 예입니다.

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);