#ifndef TRACE_LOG_H #define TRACE_LOG_H #include <string> #include <fstream> #define LOG_INFO(...) {TraceLog::GetInst().Write("[INFO]", \ TraceLog::GetInst().Format("[%s][%s:%d]", __func__, __FILE__, __LINE__), \ TraceLog::GetInst().Format(__VA_ARGS__) \ );} #define LOG_WARN(...) {TraceLog::GetInst().Write("[WARN]", \ TraceLog::GetInst().Format("[%s][%s:%d]", __func__, __FILE__, __LINE__), \ TraceLog::GetInst().Format(__VA_ARGS__) \ );} #define LOG_ERROR(...) {TraceLog::GetInst().Write("[ERROR]", \ TraceLog::GetInst().Format("[%s][%s:%d]", __func__, __FILE__, __LINE__), \ TraceLog::GetInst().Format(__VA_ARGS__) \ );} #define LOG_DEBUG(...) {TraceLog::GetInst().Write("[DEBUG]", \ TraceLog::GetInst().Format("[%s][%s:%d]", __func__, __FILE__, __LINE__), \ TraceLog::GetInst().Format(__VA_ARGS__) \ );} class TraceLog { public: static TraceLog& GetInst(); TraceLog(const TraceLog& log) = delete; void Open(const std::string& path); void Close(); void Write(const std::string& flag, const std::string& pos, const std::string& msg); std::string Format(const char* fmt, ...); private: TraceLog() = default; std::ofstream ofs_; }; #endif
#include <stdio.h> #include <stdarg.h> #include <string> #include <fstream> #include <ctime> #include "TraceLog.h" using namespace std; TraceLog& TraceLog::GetInst() { static TraceLog log; return log; } void TraceLog::Open(const std::string& path) { ofs_.open(path, ifstream::out); } void TraceLog::Close() { if (ofs_.is_open()) { ofs_.close(); } } void TraceLog::Write(const std::string& flag, const std::string& pos, const std::string& msg) { if (ofs_.is_open()) { time_t now = time(0); tm t; localtime_s(&t, &now); char buf[20] = { 0 }; sprintf_s(buf, sizeof(buf), "[%04d%02d%02d %02d:%02d:%02d]", 1900 + t.tm_year, 1 + t.tm_mon, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec); ofs_ << flag << buf<< pos << msg << "\n"; } } string TraceLog::Format(const char* fmt, ...) { char buf[1024] = { 0 }; va_list aptr; va_start(aptr, fmt); vsprintf_s(buf, sizeof(buf), fmt, aptr); va_end(aptr); return buf; }