【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文件输出流,将日志输出到文件中


浙公网安备 33010602011771号