2024. 1. 11. 19:36ㆍ코딩세상/C-언어
printf 출력이 실시간이 아니라는 것을 이야기하였는데, fprintf와 혼용하여 사용하기에는 조금 복잡한 면이 있다.
프로그램상 환경에 따라 출력 양을 조절할 필요도 있다.
log level조정과 다양한 형식으로의 출력을 할 수 있는 공개된 소스가 많이 있는데, 기능이 많다 보니 적용하여 사용하기에 어려움을 겪는 부분도 있다.
공개된 소스가 아닌, 아주 간단한 MACRO를 이용하여 단순한 형태의 log level을 설정하여 보자.
안드로이드에서 많이 보이는 ALOGV, ALOGI, ALOGD,ALOGE 로 사용하여 보자.
먼저 출력할 순서를 정하자.
기본적으로 출력할 수 있는 log macro를 만들어 보자.
현재 level이 출력이 가능한지 check하고 출력하도록 하자.
C언어 함수와 같이 사용 할 수 있게 do { } while (0) 문을 사용하였다.
가독성을 높이기 위하여 "\" 를 사용하여 여러 줄에 선언을 하였다.
이제 ALOG 매크로 함수를 정의 하자.
error의 경우에는 실시간으로 출력이 될 수 있도록 stderr로 출력하자.
log.h로 저장할 내용은 다음과 같다.
#ifndef __LOG_H__ #define __LOG_H__ typedef enum { L_VERVOSE, L_INFO, L_DEBUG, L_ERROR, } log_level_e; #define _LOG_BASE(fd, lvl, fmt, ...) \ do { if (0 == is_log_out(lvl)) { \ fprintf(fd, (fmt), ##__VA_ARGS__); \ } \ } while ( 0 ) #define ALOGV(fmt, ...) _LOG_BASE(stdout, L_VERVOSE, fmt, ##__VA_ARGS__) #define ALOGI(fmt, ...) _LOG_BASE(stdout, L_INFO, fmt, ##__VA_ARGS__) #define ALOGD(fmt, ...) _LOG_BASE(stdout, L_DEBUG, fmt, ##__VA_ARGS__) #define ALOGE(fmt, ...) _LOG_BASE(stderr, L_ERROR, fmt, ##__VA_ARGS__) #endif // __LOG_H__ |
log level을 설정하여 출력할 수 있는 함수를 만들어 보자
현재 출력 lovel을 L_INFO로 설정을 하였으므로, ALOGV를 제외한 나머지 출력들이 이루어져야 한다.
출력 시험용 함수도 아래 추가 하였다.
#include <stdio.h> #include "log.h" static log_level_e g_log_lvl = L_INFO; int is_log_out(log_level_e level) { if (level < g_log_lvl) return -1; return 0; } int main(int argc, char **argv) { ALOGV("VERVOSE %d\n", 100); ALOGI("INFO %d\n", 100); ALOGD("DEBUG %d\n", 100); ALOGE("ERROR %d\n", 100); } |
간단한 MACRO 형식의 log level 설정이므로 적용하여 사용하기에는 쉬울 것이다.
'코딩세상 > C-언어' 카테고리의 다른 글
(C언어) network byte order, float 변환 함수 구현 (ntohf, htonf) (0) | 2024.01.15 |
---|---|
(C언어) String의 주소 이해하기 ("...") (1) | 2024.01.09 |
(C언어) 연속된 enum 처리를 위한 switch문 사용하기 (case 0 ... 9:) (0) | 2024.01.08 |
(C언어) 변수에 저장된 값을 10진수 16진수 string으로 변환하기 (0) | 2024.01.05 |
(C언어) printf() 함수 성능 및 예외 상황에서 출력 이해하기 (1) | 2024.01.04 |