# C++日志系统设计 **Repository Path**: ss103838/c-log-system-design ## Basic Information - **Project Name**: C++日志系统设计 - **Description**: 特点: ​ 功能简单:代码短小,仅一百多行代码 ​ 使用方便:debug、info、warn、error、fatal、宏函数直接引入即可 需求: 1、日志存储:文本文件 2、日志内容:时间、级别、文件、行号、内容 3、日志级别:debug time_t ticks = time(NULL); struct tm* ptm = localtime(&ticks); char timestamp[32]; memset(timestamp, 0, sizeof(timestamp)); strftime(timestamp, sizeof(timestamp), "%Y-%m-%d %H:%M:%S", ptm); std::cout< level) { return; } if (m_fout.fail()) { throw std::logic_error("打开日志文件失败:" + m_filename); } // 获取当前时间 time_t ticks = time(NULL); struct tm* ptm = localtime(&ticks); char timestamp[32]; memset(timestamp, 0, sizeof(timestamp)); strftime(timestamp, sizeof(timestamp), "%Y-%m-%d %H:%M:%S", ptm); char sumprintf[256]; int len = 0; const char* fmt = "%s %s %s:%d"; len = snprintf(NULL, 0, fmt, timestamp, s_level[level], file, line); if (len > 0) { char* buffer=new char[len+1]; snprintf(sumprintf, len + 1, fmt, timestamp, s_level[level], file, line); snprintf(buffer, len + 1, fmt, timestamp, s_level[level], file, line); buffer[len] = 0; //strcat(sumprintf, buffer); //std::cout << sumprintf << std::endl; m_fout << buffer; delete[] buffer; m_len += len; } va_list arg_ptr; va_start(arg_ptr, format); len = vsnprintf(NULL, 0, format, arg_ptr); va_end(arg_ptr); if (len > 0) { char* content = new char[len + 1]; va_start(arg_ptr, format); vsnprintf(content, len + 1, format, arg_ptr); va_end(arg_ptr); content[len] = 0; // 往文本里面写数据 m_fout << content; strcat(sumprintf, content); delete[] content; m_len += len; } std::cout << sumprintf << std::endl; // 换行 m_fout << "\n"; m_fout.flush(); if (m_max > 0 && m_len >= m_max) { // 日志回滚,重新打开新的文件,并重新命名 rotate(); } } ``` - 日志回滚,重新打开新的文件,并重新命名 ```c++ void Logger::rotate() { close(); time_t ticks = time(NULL); struct tm* ptm = localtime(&ticks); char timestamp[32]; memset(timestamp, 0, sizeof(timestamp)); strftime(timestamp, sizeof(timestamp), ".%Y-%m-%d_%H-%M-%S", ptm); string filename = m_filename + timestamp; if (rename(m_filename.c_str(), filename.c_str()) != 0) { throw std::logic_error("命名日志文件失败:" + string(strerror(errno))); } open(m_filename); } ``` 项目截图: ![image-20221112130639645](readme.assets/image-20221112130639645.png) ![image-20221112130808757](readme.assets/image-20221112130808757.png)