| | |
| | | class Log |
| | | { |
| | | public: |
| | | //C++11以å,使ç¨å±é¨åéææ±ä¸ç¨å é |
| | | // C++11以å,使ç¨å±é¨åéææ±ä¸ç¨å é |
| | | static Log *get_instance() |
| | | { |
| | | static Log instance; |
| | |
| | | { |
| | | 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; |
| | | //ä»é»å¡éåä¸ååºä¸ä¸ªæ¥å¿stringï¼åå
¥æä»¶ |
| | | // ä»é»å¡éåä¸ååºä¸ä¸ªæ¥å¿stringï¼åå
¥æä»¶ |
| | | 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: |
| | | char dir_name[128]; //è·¯å¾å |
| | | char log_name[128]; //logæä»¶å |
| | | int m_split_lines; //æ¥å¿æå¤§è¡æ° |
| | | int m_log_buf_size; //æ¥å¿ç¼å²åºå¤§å° |
| | | long long m_count; //æ¥å¿è¡æ°è®°å½ |
| | | int m_today; //å 为æå¤©åç±»,è®°å½å½åæ¶é´æ¯é£ä¸å¤© |
| | | FILE *m_fp; //æå¼logçæä»¶æé |
| | | char dir_name[128]; // è·¯å¾å |
| | | char log_name[128]; // logæä»¶å |
| | | int m_split_lines; // æ¥å¿æå¤§è¡æ° |
| | | int m_log_buf_size; // æ¥å¿ç¼å²åºå¤§å° |
| | | long long m_count; // æ¥å¿è¡æ°è®°å½ |
| | | int m_today; // å 为æå¤©åç±»,è®°å½å½åæ¶é´æ¯é£ä¸å¤© |
| | | FILE *m_fp; // æå¼logçæä»¶æé |
| | | char *m_buf; |
| | | block_queue<string> *m_log_queue; //é»å¡éå |
| | | bool m_is_async; //æ¯å¦åæ¥æ å¿ä½ |
| | | block_queue<string> *m_log_queue; // é»å¡éå |
| | | bool m_is_async; // æ¯å¦åæ¥æ å¿ä½ |
| | | locker m_mutex; |
| | | int m_close_log; //å
³éæ¥å¿ |
| | | 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();} |