게임/라이브러리

glog

MAKGA 2021. 8. 29. 16:36
320x100

프로젝트 내 로그 라이브러리로 glog를 사용하기로 해서 빌드 관련 내용을 정리한다.

 

다운로드 경로

github: https://github.com/google/glog

site: https://code.google.com/archive/p/google-glog/downloads

 

glog 특징

thread-safe함

level별로 파일이 생성

상위 level 내용이 하위 level에도 write됨


 

glog-0.3.3 버전을 사용했고, 개발 환경에 따라 맞게 셋팅해준다.

 

현재 프로젝트는 멀티바이트와 x64 환경이고, 프로젝트 내 공통 정적 라이브러리가 이미 존재하므로 동일하게 정적으로 빌드해서 사용했다. (문자 집합 변경, x64 플랫폼 추가, libglog_static 빌드 사용)

 

처음 프로젝트를 열면 x86 밖에 없으므로 x64 옵션을 만들어 주고, (dll 사용할 경우에) 프로젝트 내 WIN32 디파인을 WIN64로 변경해 적용한다.


error case

1. error C4235: 비표준 확장이 사용됨: 이 아키텍처에서는 '__asm' 키워드를 사용할 수 없습니다.

-> static void logging_fail() 함수 내 _asm int 3 코드를 __debugbreak(); 코드로 변경

 

2. error C2084: 'int snprintf(char *const ,const size_t,const char *const ,...)' 함수에 이미 본문이 있습니다.

-> port.cc 파일에 있는 'int snprintf() 함수 정의 부분을 주석처리 하거나 삭제

 

3. std::ostream 관련 link error

-> glog 함수 사용시 std::ostream 부분의 link 에러로 고생했다. 그런 경우에 glog header 파일 include를 프로젝트 최상단에서 하도록 변경한다. (동적라이브러리 사용시 link 에러로 삽질 하다가 정적라이브러리 사용으로 변경)


커스텀 관련

프로젝트 설정에 따라 일부 기능과 format 커스텀

 

1. glolg는 level별 로그 파일이 생성된다.

-> log level 통합 파일을 원해서 프로젝트 내부적으로 log level을 나누고, log level은 파일 내부에만 기록, glog는 단일 level로 작성

 

2. glog는 상위 level의 내용이 하위 level 로그 파일에도 저장된다.

-> 동일한 내용 기록은 불필요해서 각 레벨별 파일에만 write되게 변경

 

3. 파일명과 내부 로그 format대로 변경

 

4. log header 내용 삭제


사용법

사용 관련 설정 값들은 config에 넣고 사전 정의한 macro를 사용해 초기화와 설정 진행함.

 

함수

// glog 사용시 초기화

google::InitGoogleLogging(const char* arg);

 

// log file 확장자 설정

google::SetLogFilenameExtension(const char*);

 

// console에 write될 min log level 설정

google::SetStderrLogging(LogSeverity);

 

// 모든 log console에 write

google::LogToStderr();

 

// glog 사용 종료시 release

google::ShutdownGoogleLogging();

 

 

플래그

// Set whether log messages go to stderr instead of logfiles
로그 메시지가 로그 파일 대신 stderr에 기록될지 여부
DECLARE_bool(logtostderr);
fLB::FLAGS_logtostderr = true / false;

// Set whether log messages go to stderr in addition to logfiles.
로그 메시지가 로그 파일 외에도 stderr에 기록될지 여부
DECLARE_bool(alsologtostderr);
fLB::FLAGS_alsologtostderr = true / false;

// Log messages at a level >= this flag are automatically sent to
// stderr in addition to log files.
설정된 레벨 이상의 로그는 자동으로 stderr에 기록
DECLARE_int32(stderrthreshold);
fLI::FALGS_stderrthreshold = GLOG_WARNING;

// Log suppression level: messages logged at a lower level than this
// are suppressed.
설정된 레벨보다 하위 레벨은 메시지를 기록하지 않음
DECLARE_int32(minloglevel);
fLI::FLAGS_minloglevel = GLOG_ERROR;

// If specified, logfiles are written into this directory instead of the
// default logging directory.
기본 디렉토리 대신 로그 파일이 저장될 경로 설정
DECLARE_string(log_dir);
fLS::FALGS_log_dir = "log\\";

// Sets the maximum log file size (in MB).
파일당 기록될 최대 용량 (단위: MB)
DECLARE_int32(max_log_size);
fLI::FLAGS_max_log_size = 20;

 

 

사용 정의 매크로

 

#define GOOGLE_GLOG_DLL_DECL
#define GLOG_NO_ABBREVIATED_SEVERITIES
#ifdef ERROR
#undef ERROR
#endif

 

#define G_LOG_INIT(name, suffix, setting) \
    fLS::FLAGS_log_dir = setting->path + name + std::string("\\"); \
    std::string suffixFullName = name + suffix; \
    google::InitGoogleLogging(suffixFullName.c_str()); \
    google::SetLogFilenameExtension(setting->extension.c_str()); \
    fLI::FLAGS_stderrthreshold = setting->stderrThreshold; \
    fLI::FLAGS_max_log_size = setting->maxFileSizeMB;

 

#define FILE_INFO_FORMAT "(" << __file__ << "::" << __func__ << "::" << __line__

 

enum { DEBUG, INFO, WARN, ERROR, FATAL };

constexpr char* kSeverityLevel[] = { "DEBUG", "INFO", "WARN", "ERROR", "FATAL" };

 

#define LOG_INFO_STREAM LOG(INFO)

#define LOG_WARN_STREAM LOG(WARN)

#define LOG_ERROR_STREAM LOG(ERROR)

#define LOG_FATAL_STREAM LOG(FATAL)

 

#define LOG_DEBUG LOG_ERROR_STREAM << "[" << kSeverityLevel[DEBUG] << "] " << FILE_INFO_FORMAT

#define LOG_INFO LOG_ERROR_STREAM << "[" << kSeverityLevel[INFO] << "] " << FILE_INFO_FORMAT

#define LOG_WARN LOG_ERROR_STREAM << "[" << kSeverityLevel[WARN] << "] " << FILE_INFO_FORMAT

#define LOG_ERROR LOG_ERROR_STREAM << "[" << kSeverityLevel[ERROR] << "] " << FILE_INFO_FORMAT

#define LOG_FATAL LOG_ERROR_STREAM << "[" << kSeverityLevel[FATAL] << "] " << FILE_INFO_FORMAT

320x100

'게임 > 라이브러리' 카테고리의 다른 글

Recast & Detour  (1) 2021.11.11
flatbuffer  (0) 2021.10.23
rapidjson  (0) 2020.07.04