static ssize_t _log_fwrite(struct iovec *vec, int n) { int i, ret; unsigned long long tmp_size = get_file_size_by_fp(_log_fp); if (UNLIKELY(tmp_size > _log_file_size)) { if (CHECK_LOG_PREFIX(_log_prefix, LOG_VERBOSE_BIT)) { fprintf(stderr, "%s size= %llu reach max %llu, splited\n", _log_name, tmp_size, _log_file_size); } if (EOF == _log_fclose()) { fprintf(stderr, "_log_fclose errno:%d", errno); } log_get_time(_log_name_time, sizeof(_log_name_time), 1); snprintf(_log_name, sizeof(_log_name), "%s%s_%s", _log_path, _log_name_prefix, _log_name_time); _log_fopen(_log_name); if (CHECK_LOG_PREFIX(_log_prefix, LOG_VERBOSE_BIT)) { fprintf(stderr, "splited file %s\n", _log_name); } } for (i = 0; i < n; i++) { ret = fprintf(_log_fp, "%s", (char *)vec[i].iov_base); if (ret != (int)vec[i].iov_len) { fprintf(stderr, "fprintf failed: %s\n", strerror(errno)); return -1; } if (EOF == fflush(_log_fp)) { fprintf(stderr, "fflush failed: %s\n", strerror(errno)); return -1; } } return 0; }
static void __log_init(void) { int type = _log_type; const char *ident = _log_ident; if (_is_log_init) { return; } log_check_env(); #ifdef LOG_VERBOSE_ENABLE UPDATE_LOG_PREFIX(_log_prefix, LOG_VERBOSE_BIT); #endif UPDATE_LOG_PREFIX(_log_prefix, LOG_FUNCLINE_BIT); #ifdef LOG_IO_OPS _log_use_io = 1; #endif if (_log_use_io) { _log_handle = &log_io_ops; } else { _log_handle = &log_fio_ops; } if (CHECK_LOG_PREFIX(_log_prefix, LOG_VERBOSE_BIT)) { memset(_proc_name, 0, sizeof(_proc_name)); char *proc = get_proc_name(); if (proc) { memset(_log_name, 0, sizeof(_log_name)); strncpy(_proc_name, proc, strlen(proc)); free(proc); } } if (type == 0) { } else { _log_output = type; } switch (_log_output) { case LOG_STDERR: _log_driver = &log_stderr_driver; break; case LOG_FILE: _log_driver = &log_file_driver; break; case LOG_RSYSLOG: _log_driver = &log_rsys_driver; break; default: fprintf(stderr, "unsupport log type!\n"); break; } _log_driver->init(ident); _is_log_init = 1; pthread_mutex_init(&_log_mutex, NULL); return; }
/* *time: level: process[pid]: [tid] tag: message * [verbose ] */ static int _log_print(int lvl, const char *tag, const char *file, int line, const char *func, const char *msg) { int ret = 0, i = 0; struct iovec vec[LOG_IOVEC_MAX]; char s_time[LOG_TIME_SIZE]; char s_lvl[LOG_LEVEL_SIZE]; char s_tag[LOG_TAG_SIZE]; char s_pname[LOG_PNAME_SIZE]; char s_pid[LOG_PNAME_SIZE]; char s_tid[LOG_PNAME_SIZE]; char s_file[LOG_TEXT_SIZE]; char s_msg[LOG_BUF_SIZE]; pthread_mutex_lock(&_log_mutex); log_get_time(s_time, sizeof(s_time), 0); if (_log_fp == stderr || _log_fd == STDERR_FILENO) { switch(lvl) { case LOG_EMERG: case LOG_ALERT: case LOG_CRIT: case LOG_ERR: snprintf(s_lvl, sizeof(s_lvl), B_RED("[%7s]"), _log_level_str[lvl]); snprintf(s_msg, sizeof(s_msg), RED("%s"), msg); break; case LOG_WARNING: snprintf(s_lvl, sizeof(s_lvl), B_YELLOW("[%7s]"), _log_level_str[lvl]); snprintf(s_msg, sizeof(s_msg), YELLOW("%s"), msg); break; case LOG_INFO: snprintf(s_lvl, sizeof(s_lvl), B_GREEN("[%7s]"), _log_level_str[lvl]); snprintf(s_msg, sizeof(s_msg), GREEN("%s"), msg); break; case LOG_DEBUG: snprintf(s_lvl, sizeof(s_lvl), B_WHITE("[%7s]"), _log_level_str[lvl]); snprintf(s_msg, sizeof(s_msg), WHITE("%s"), msg); break; default: snprintf(s_lvl, sizeof(s_lvl), "[%7s]", _log_level_str[lvl]); snprintf(s_msg, sizeof(s_msg), "%s", msg); break; } } else { snprintf(s_lvl, sizeof(s_lvl), "[%7s]", _log_level_str[lvl]); snprintf(s_msg, sizeof(s_msg), "%s", msg); } if (CHECK_LOG_PREFIX(_log_prefix, LOG_PIDTID_BIT)) { snprintf(s_pname, sizeof(s_pname), "[%s ", _proc_name); snprintf(s_pid, sizeof(s_pid), "pid:%d ", getpid()); snprintf(s_tid, sizeof(s_tid), "tid:%d]", _gettid()); snprintf(s_tag, sizeof(s_tag), "[%s]", tag); snprintf(s_file, sizeof(s_file), "[%s:%d: %s] ", file, line, func); } if (CHECK_LOG_PREFIX(_log_prefix, LOG_FUNCLINE_BIT)) { snprintf(s_file, sizeof(s_file), "[%s:%d: %s] ", file, line, func); } i = -1; if (CHECK_LOG_PREFIX(_log_prefix, LOG_TIMESTAMP_BIT)) { vec[++i].iov_base = (void *)s_time; vec[i].iov_len = strlen(s_time); } if (CHECK_LOG_PREFIX(_log_prefix, LOG_PIDTID_BIT)) { vec[++i].iov_base = (void *)s_pname; vec[i].iov_len = strlen(s_pname); vec[++i].iov_base = (void *)s_pid; vec[i].iov_len = strlen(s_pid); vec[++i].iov_base = (void *)s_tid; vec[i].iov_len = strlen(s_tid); } vec[++i].iov_base = (void *)s_lvl; vec[i].iov_len = strlen(s_lvl); if (CHECK_LOG_PREFIX(_log_prefix, LOG_TAG_BIT)) { vec[++i].iov_base = (void *)s_tag; vec[i].iov_len = strlen(s_tag); } if (CHECK_LOG_PREFIX(_log_prefix, LOG_FUNCLINE_BIT)) { vec[++i].iov_base = (void *)s_file; vec[i].iov_len = strlen(s_file); } vec[++i].iov_base = (void *)s_msg; vec[i].iov_len = strlen(s_msg); if (UNLIKELY(!_log_syslog)) { ret = _log_handle->write(vec, i+1); } pthread_mutex_unlock(&_log_mutex); return ret; }