日志打印输出

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值