Merge branch 'master' of ssh://115.28.86.8:29418/~admin/昆仑_1025
| | |
| | | "C_Cpp_Runner.debuggerPath": "gdb", |
| | | "C_Cpp_Runner.cStandard": "", |
| | | "C_Cpp_Runner.cppStandard": "", |
| | | "C_Cpp_Runner.msvcBatchPath": "C:/Program Files/Microsoft Visual Studio/VR_NR/Community/VC/Auxiliary/Build/vcvarsall.bat", |
| | | "C_Cpp_Runner.msvcBatchPath": "C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Auxiliary/Build/vcvarsall.bat", |
| | | "C_Cpp_Runner.useMsvc": false, |
| | | "C_Cpp_Runner.warnings": [ |
| | | "-Wall", |
| | |
| | | |
| | | 忥/弿¥æ¥å¿ç³»ç» |
| | | 弿¥æ¥å¿ç³»ç» |
| | | =============== |
| | | 忥/弿¥æ¥å¿ç³»ç»ä¸»è¦æ¶åäºä¸¤ä¸ªæ¨¡åï¼ä¸ä¸ªæ¯æ¥å¿æ¨¡åï¼ä¸ä¸ªæ¯é»å¡é忍¡å,å
¶ä¸å å
¥é»å¡é忍¡åä¸»è¦æ¯è§£å³å¼æ¥åå
¥æ¥å¿ååå¤. |
| | | 弿¥æ¥å¿ç³»ç»ä¸»è¦æ¶åäºä¸¤ä¸ªæ¨¡åï¼ä¸ä¸ªæ¯æ¥å¿æ¨¡åï¼ä¸ä¸ªæ¯é»å¡é忍¡å,å
¶ä¸å å
¥é»å¡é忍¡åä¸»è¦æ¯è§£å³å¼æ¥åå
¥æ¥å¿ååå¤. |
| | | > * èªå®ä¹é»å¡éå |
| | | > * å便¨¡å¼å建æ¥å¿ |
| | | > * 忥æ¥å¿ |
| | | > * 弿¥æ¥å¿ |
| | | > * å®ç°æå¤©ãè¶
è¡åç±» |
| | | > * æä»¶éå¶å¤§å° 鲿¢æ¥å¿æä»¶è¿å¤§ |
| | |
| | | fclose(m_fp); |
| | | } |
| | | } |
| | | //弿¥éè¦è®¾ç½®é»å¡éåçé¿åº¦ï¼åæ¥ä¸éè¦è®¾ç½® |
| | | |
| | | bool Log::init(const char *file_name, int close_log, int log_buf_size, int split_lines, int max_queue_size) |
| | | { |
| | | //å¦æè®¾ç½®äºmax_queue_size,åè®¾ç½®ä¸ºå¼æ¥ |
| | | if (max_queue_size >= 1) |
| | | { |
| | | m_is_async = true; |
| | | m_log_queue = new block_queue<string>(max_queue_size); |
| | | pthread_t tid; |
| | | //flush_log_thread为åè°å½æ°,è¿é表示å建线ç¨å¼æ¥åæ¥å¿ |
| | | pthread_create(&tid, NULL, flush_log_thread, NULL); |
| | | } |
| | | |
| | |
| | | |
| | | time_t t = time(NULL); |
| | | struct tm *sys_tm = localtime(&t); |
| | | struct tm my_tm = *sys_tm; |
| | | |
| | | |
| | | const char *p = strrchr(file_name, '/'); |
| | | char log_full_name[256] = {0}; |
| | | |
| | | if (p == NULL) |
| | | { |
| | | snprintf(log_full_name, 255, "%d_%02d_%02d_%s", my_tm.tm_year + 1900, my_tm.tm_mon + 1, my_tm.tm_mday, file_name); |
| | | snprintf(log_full_name, 255, "%d_%02d_%02d_%s", sys_tm->tm_year + 1900, sys_tm->tm_mon + 1, sys_tm->tm_mday, file_name); |
| | | } |
| | | else |
| | | { |
| | | strcpy(log_name, p + 1); |
| | | strncpy(dir_name, file_name, p - file_name + 1); |
| | | snprintf(log_full_name, 255, "%s%d_%02d_%02d_%s", dir_name, my_tm.tm_year + 1900, my_tm.tm_mon + 1, my_tm.tm_mday, log_name); |
| | | snprintf(log_full_name, 255, "%s%d_%02d_%02d_%s", dir_name, sys_tm->tm_year + 1900, sys_tm->tm_mon + 1, sys_tm->tm_mday, log_name); |
| | | } |
| | | |
| | | m_today = my_tm.tm_mday; |
| | | |
| | | m_today = sys_tm->tm_mday; |
| | | m_fp = fopen(log_full_name, "a"); |
| | | if (m_fp == NULL) |
| | | { |
| | |
| | | |
| | | void Log::write_log(int level, const char *format, ...) |
| | | { |
| | | struct timeval now = {0, 0}; |
| | | struct timeval now; |
| | | gettimeofday(&now, NULL); |
| | | time_t t = now.tv_sec; |
| | | struct tm *sys_tm = localtime(&t); |
| | | struct tm my_tm = *sys_tm; |
| | | char s[16] = {0}; |
| | | |
| | | switch (level) |
| | | { |
| | | case 0: |
| | | strcpy(s, "[debug]:"); |
| | | break; |
| | | case 1: |
| | | strcpy(s, "[info]:"); |
| | | break; |
| | | case 2: |
| | | strcpy(s, "[warn]:"); |
| | | break; |
| | | case 3: |
| | | strcpy(s, "[erro]:"); |
| | | break; |
| | | default: |
| | | strcpy(s, "[info]:"); |
| | | break; |
| | | case 0: strcpy(s, "[debug]:"); break; |
| | | case 1: strcpy(s, "[info]:"); break; |
| | | case 2: strcpy(s, "[warn]:"); break; |
| | | case 3: strcpy(s, "[erro]:"); break; |
| | | default: strcpy(s, "[info]:"); break; |
| | | } |
| | | //åå
¥ä¸ä¸ªlogï¼å¯¹m_count++, m_split_linesæå¤§è¡æ° |
| | | |
| | | m_mutex.lock(); |
| | | m_count++; |
| | | |
| | | if (m_today != my_tm.tm_mday || m_count % m_split_lines == 0) //everyday log |
| | | if (m_today != sys_tm->tm_mday || m_count % m_split_lines == 0) |
| | | { |
| | | |
| | | char new_log[256] = {0}; |
| | | fflush(m_fp); |
| | | fclose(m_fp); |
| | | char tail[16] = {0}; |
| | | snprintf(tail, 16, "%d_%02d_%02d_", sys_tm->tm_year + 1900, sys_tm->tm_mon + 1, sys_tm->tm_mday); |
| | | |
| | | snprintf(tail, 16, "%d_%02d_%02d_", my_tm.tm_year + 1900, my_tm.tm_mon + 1, my_tm.tm_mday); |
| | | |
| | | if (m_today != my_tm.tm_mday) |
| | | if (m_today != sys_tm->tm_mday) |
| | | { |
| | | snprintf(new_log, 255, "%s%s%s", dir_name, tail, log_name); |
| | | m_today = my_tm.tm_mday; |
| | | m_today = sys_tm->tm_mday; |
| | | m_count = 0; |
| | | } |
| | | else |
| | |
| | | m_fp = fopen(new_log, "a"); |
| | | } |
| | | |
| | | m_mutex.unlock(); |
| | | // å¨åå
¥ä¹åæ£æ¥æ¥å¿æä»¶å¤§å° |
| | | if (check_log_size()) |
| | | { |
| | | rotate_logs(); // 妿è¶
è¿æå¤§æä»¶å¤§å°ï¼è¿è¡æ¥å¿è½®æ¢ |
| | | } |
| | | |
| | | va_list valst; |
| | | va_start(valst, format); |
| | | |
| | | string log_str; |
| | | m_mutex.lock(); |
| | | |
| | | //åå
¥çå
·ä½æ¶é´å
å®¹æ ¼å¼ |
| | | int n = snprintf(m_buf, 48, "%d-%02d-%02d %02d:%02d:%02d.%06ld %s ", |
| | | my_tm.tm_year + 1900, my_tm.tm_mon + 1, my_tm.tm_mday, |
| | | my_tm.tm_hour, my_tm.tm_min, my_tm.tm_sec, now.tv_usec, s); |
| | | |
| | | sys_tm->tm_year + 1900, sys_tm->tm_mon + 1, sys_tm->tm_mday, |
| | | sys_tm->tm_hour, sys_tm->tm_min, sys_tm->tm_sec, now.tv_usec, s); |
| | | int m = vsnprintf(m_buf + n, m_log_buf_size - n - 1, format, valst); |
| | | m_buf[n + m] = '\n'; |
| | | m_buf[n + m + 1] = '\0'; |
| | |
| | | void Log::flush(void) |
| | | { |
| | | m_mutex.lock(); |
| | | //强å¶å·æ°åå
¥æµç¼å²åº |
| | | fflush(m_fp); |
| | | m_mutex.unlock(); |
| | | } |
| | | |
| | | // æ·»å çæä»¶å¤§å°æ£æ¥å½æ° |
| | | bool Log::check_log_size() |
| | | { |
| | | if (m_fp) |
| | | { |
| | | fseek(m_fp, 0, SEEK_END); |
| | | long file_size = ftell(m_fp); |
| | | return file_size >= max_size; // è¿åæä»¶æ¯å¦è¶
åºéå¶ |
| | | } |
| | | return false; |
| | | } |
| | | |
| | | void Log::rotate_logs() |
| | | { |
| | | fclose(m_fp); // å
³éå½åæ¥å¿æä»¶ |
| | | char new_log[256] = {0}; |
| | | snprintf(new_log, sizeof(new_log), "%s/%s.%lld", dir_name, log_name, m_count / m_split_lines); |
| | | m_fp = fopen(new_log, "a"); // æå¼æ°çæ¥å¿æä»¶ |
| | | m_count = 0; // éç½®æ¥å¿è®¡æ° |
| | | } |
| | |
| | | { |
| | | Log::get_instance()->async_write_log(); |
| | | } |
| | | |
| | | //å¯éæ©çåæ°ææ¥å¿æä»¶ãæ¥å¿ç¼å²åºå¤§å°ãæå¤§è¡æ°ä»¥åæé¿æ¥å¿æ¡éå |
| | | bool init(const char *file_name, int close_log, int log_buf_size = 8192, int split_lines = 5000000, int max_queue_size = 0); |
| | | |
| | | void write_log(int level, const char *format, ...); |
| | | |
| | | void flush(void); |
| | | |
| | | private: |
| | | Log(); |
| | | virtual ~Log(); |
| | | |
| | | void *async_write_log() |
| | | { |
| | | string single_log; |
| | |
| | | while (m_log_queue->pop(single_log)) |
| | | { |
| | | m_mutex.lock(); |
| | | if (check_log_size()) // æ£æ¥æä»¶å¤§å° |
| | | { |
| | | rotate_logs(); // è½®æ¢æ¥å¿ |
| | | } |
| | | fputs(single_log.c_str(), m_fp); |
| | | m_mutex.unlock(); |
| | | } |
| | | } |
| | | |
| | | // æ£æ¥æ¥å¿æä»¶å¤§å° |
| | | bool check_log_size() |
| | | { |
| | | if (m_fp) |
| | | { |
| | | fseek(m_fp, 0, SEEK_END); |
| | | long file_size = ftell(m_fp); |
| | | return file_size >= max_size; // è¿åæä»¶æ¯å¦è¶
åºéå¶ |
| | | } |
| | | return false; |
| | | } |
| | | |
| | | // è½®æ¢æ¥å¿æä»¶ |
| | | void rotate_logs() |
| | | { |
| | | fclose(m_fp); // å
³éå½åæ¥å¿æä»¶ |
| | | char new_log[256] = {0}; |
| | | snprintf(new_log, sizeof(new_log), "%s/%s.%lld", dir_name, log_name, m_count / m_split_lines); |
| | | m_fp = fopen(new_log, "a"); // æå¼æ°çæ¥å¿æä»¶ |
| | | m_count = 0; // éç½®æ¥å¿è®¡æ° |
| | | } |
| | | |
| | | private: |
| | |
| | | bool m_is_async; //æ¯å¦åæ¥æ å¿ä½ |
| | | locker m_mutex; |
| | | int m_close_log; //å
³éæ¥å¿ |
| | | long max_size = 10 * 1024 * 1024; // 10MB |
| | | }; |
| | | |
| | | #define LOG_DEBUG(format, ...) if(0 == m_close_log) {Log::get_instance()->write_log(0, format, ##__VA_ARGS__); Log::get_instance()->flush();} |