| | |
| | | { |
| | | 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();} |