#define LOG_BUFFER_LEN (1024)
static char log_buf[LOG_BUFFER_LEN] = {0};
static OsiLockObj_t log_locker = NULL;
#define LOG_FILE_ENABLE (0)
#if LOG_FILE_ENABL
#define LOG_FILE_DIR "/tmp/log.txt"
static FILE* log_file_hd = NULL;
static volatile int log_file_reopen = 0;
static int log_file_write_len = 0;
#endif
static void log_file_open(void) {
#if LOG_FILE_ENABLE
if (log_file_hd)
return;
log_file_hd = fopen(LOG_FILE_DIR, "aw");
if (log_file_hd == NULL) {
printf("%s %s failed: %d %s\r\n", __FUNCTION__, LOG_FILE_DIR, errno, strerror(errno));
} else {
printf("%s\n", __FUNCTION__);
}
#endif
}
static void log_file_close(void) {
#if LOG_FILE_ENABLE
osi_LockObjLock(&log_locker);
if (log_file_hd != NULL) {
fclose(log_file_hd);
log_file_hd = NULL;
printf("%s\n", __FUNCTION__);
}
osi_LockObjUnlock(&log_locker);
#endif
}
static void log_file_write(const char* data) {
#if LOG_FILE_ENABLE
osi_LockObjLock(&log_locker);
if (log_file_hd == NULL || log_file_write_len > 50 * 1024) {
pthread_mutex_unlock(&log_locker);
return;
}
if (fwrite(data, 1, strlen(data), log_file_hd) <= 0) {
printf("%s failed\n", __FUNCTION__);
} else {
log_file_write_len = log_file_write_len + strlen(data);
}
fflush(log_file_hd);
osi_LockObjUnlock(&log_locker);
#endif
}
void log_printf(_LOG_TYPE_E type, const char* func, const int line, const char* format, ...) {
if (log_locker == NULL) {
osi_LockObjCreate(&log_locker);
}
osi_LockObjLock(&log_locker);
va_list ap;
va_start(ap, format);
switch (type) {
case LOG_TYPE_ERROR:
snprintf(log_buf, LOG_BUFFER_LEN, "%s", "E/");
break;
case LOG_TYPE_WARN:
snprintf(log_buf, LOG_BUFFER_LEN, "%s", "W/");
break;
case LOG_TYPE_DEBUG:
snprintf(log_buf, LOG_BUFFER_LEN, "%s", "D/");
break;
case LOG_TYPE_PRINT:
snprintf(log_buf, LOG_BUFFER_LEN, "%s", "I/");
break;
default:
break;
}
int idx = strlen(log_buf);
if (type == LOG_TYPE_ERROR || type == LOG_TYPE_WARN) {
snprintf(log_buf + idx, LOG_BUFFER_LEN - idx, "[%010d](%s:%d)", common_get_current_ms(),
func, line);
} else if (type == LOG_TYPE_DEBUG) {
snprintf(log_buf + idx, LOG_BUFFER_LEN - idx, "[%010d](%s)", common_get_current_ms(), func);
} else {
snprintf(log_buf + idx, LOG_BUFFER_LEN - idx, "[%010d]", common_get_current_ms());
}
idx = strlen(log_buf);
vsnprintf(log_buf + idx, LOG_BUFFER_LEN - idx, format, ap);
va_end(ap);
if (type == LOG_TYPE_ERROR) {
printf(B_RED("%s"), log_buf);
} else if (type == LOG_TYPE_WARN) {
printf(B_MAGENTA("%s"), log_buf);
} else if (type == LOG_TYPE_DEBUG) {
printf("%s", log_buf);
} else if (type == LOG_TYPE_PRINT) {
printf("%s", log_buf);
}
osi_LockObjUnlock(&log_locker);
log_file_write(log_buf);
}
void log_printf(_LOG_TYPE_E type, const char* func, const int line, const char* format, ...);
#define log_e(format, args...) log_printf(LOG_TYPE_ERROR, __FUNCTION__, __LINE__, format, ##args)
#define log_e_tag(tag, format, arg...) \
log_printf(LOG_TYPE_ERROR, __FUNCTION__, __LINE__, format, ##args)
#define log_i(format, args...) log_printf(LOG_TYPE_PRINT, __FUNCTION__, __LINE__, format, ##args)
#define log_i_tag(tag, format, args...) \
log_printf(LOG_TYPE_PRINT, __FUNCTION__, __LINE__, format, ##args)
#define log_d(format, args...) log_printf(LOG_TYPE_DEBUG, __FUNCTION__, __LINE__, format, ##args)
#define log_d_tag(tag, format, args...) \
log_printf(LOG_TYPE_DEBUG, __FUNCTION__, __LINE__, format, ##args)
#define log_w(format, args...) log_printf(LOG_TYPE_WARN, __FUNCTION__, __LINE__, format, ##args)
#define log_w_tag(tag, format, args...) \
log_printf(LOG_TYPE_WARN, __FUNCTION__, __LINE__, format, ##args)
日志打印输出
于 2023-09-21 20:34:08 首次发布