240717班级,工业化控制系统,煤矿相关行业,昆仑系统
congmu
2024-10-30 79d067bcf500355e65e26a11c345a9427ed0128c
Server/ÂíÀöƼ/code/log/log.h
@@ -24,16 +24,17 @@
    {
        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;
@@ -41,9 +42,35 @@
        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:
@@ -59,6 +86,7 @@
    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();}