【C++】输入与输出实战:日志模块

需求说明

用户输入相关内容时自动生成一条日志,可以设置日志输出的位置:控制台、string和文件

准备工作

时间函数(直接使用)用于日志输出时显示当前时间

#include<iomanip>
static std::string GetNow(
    const char* fmt = "%Y-%m-%d %H:%M:%S",
    int time_zone = 8)
{
    std::time_t unix_sec = std::time(nullptr);
    std::tm tm;
    static const int kHoursInDay = 24;
    static const int kMinutesInHour = 60;
    static const int kDaysFromUnixTime = 2472632;
    static const int kDaysFromYear = 153;
    static const int kMagicUnkonwnFirst = 146097;
    static const int kMagicUnkonwnSec = 1461;
    tm.tm_sec = unix_sec % kMinutesInHour;
    int i = (unix_sec / kMinutesInHour);
    tm.tm_min = i % kMinutesInHour; //nn
    i /= kMinutesInHour;
    tm.tm_hour = (i + time_zone) % kHoursInDay; // hh
    tm.tm_mday = (i + time_zone) / kHoursInDay;
    int a = tm.tm_mday + kDaysFromUnixTime;
    int b = (a * 4 + 3) / kMagicUnkonwnFirst;
    int c = (-b * kMagicUnkonwnFirst) / 4 + a;
    int d = ((c * 4 + 3) / kMagicUnkonwnSec);
    int e = -d * kMagicUnkonwnSec;
    e = e / 4 + c;
    int m = (5 * e + 2) / kDaysFromYear;
    tm.tm_mday = -(kDaysFromYear * m + 2) / 5 + e + 1;
    tm.tm_mon = (-m / 10) * 12 + m + 2;
    tm.tm_year = b * 100 + d - 6700 + (m / 10);
    stringstream ss;
    ss << std::put_time(&tm, fmt); //#include <iomanip>
    return ss.str();
}

代码部分

通过宏LOGDEBUG 调用 LogWrite 函数,将日志信息打印到标准输出(控制台)。
LogWrite 函数接受四个参数:日志级别(level)日志内容(log)文件名(file)行号(line)
使用 GetNow() 获取当前时间(假设 GetNow() 是某个已定义的函数,返回当前时间的字符串表示)。
将这些信息格式化后输出到控制台。
LOGDEBUG 宏,使用 __FILE____LINE__ 宏获取当前文件名和代码行号。
调用LogWrite函数,并将日志级别设置为 "debug"

main 函数调用 LOGDEBUG 宏,输出一条调试日志,内容为 "test log 001"。

输出如下

重定向 std::ostream 的缓冲区来实现日志输出流的动态控制

static ostream logstr(cout.rdbuf());声明了一个静态的 std::ostream 对象 logstr,并将其缓冲区初始化为 std::cout 的缓冲区(cout.rdbuf())。
void SetLogBuf(streambuf* buf)这个函数接受一个 std::streambuf* 指针,并将其设置为 logstr 的缓冲区。

用新定义地缓冲区来控制流输出

定义一个字符串流,将输出流设置为该字符串流,输出该流,即完成了对于字符串的输出

用std::ofstream文件输出流,将日志输出到文件中

posted @ 2025-04-28 19:38  plusu  阅读(38)  评论(0)    收藏  举报