__FILE__、__FUNCTION__、__LINE__、__DATA__、__TIME__
代码展示(头文件)
#include <iostream>
#include <string>
#include <stdarg.h>
#include <vector>
#include <chrono>
#include <thread>
using namespace std;
// <!--配置参数:日志级别,0:系统 / 重要错误(Fatal),1 : 错误(Error),
//2 : 警告(Warn),3 : 注意(Notice), 4 : 提示(Info),
//5 : 调试(Debug),6 : 低级别调试Trace; 默认1 Error-->
#define FATAL_LOG(...) Logger::GetSingletonInstance()->debug_log("FATAL", __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__)
#define ERROR_LOG(...) Logger::GetSingletonInstance()->debug_log("ERROR", __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__)
#define WARN_LOG(...) Logger::GetSingletonInstance()->debug_log("WARN" , __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__)
#define NOTICE_LOG(...) Logger::GetSingletonInstance()->debug_log("NOTICE", __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__)
#define INFO_LOG(...) Logger::GetSingletonInstance()->debug_log("INFO", __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__)
#define DEBUG_LOG(...) Logger::GetSingletonInstance()->debug_log("DEBUG", __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__)
#define TRACE_LOG(...) Logger::GetSingletonInstance()->debug_log("TRACE", __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__)
class Logger{
public:
void init(string file_name){
logger_file = fopen(file_name.c_str(), "a+");
}
void uninit(){
fclose(logger_file);
}
static Logger* GetSingletonInstance(){
static Logger s_logger;
return &s_logger;
}
void debug_log(
const char *logLevel,
const char *file,
const char *func,
const int iLine,
const char *format, ...)
{
static char output[1024] = { 0 };
va_list arglst;
va_start(arglst, format);
vsnprintf(output, sizeof(output), format, arglst);
fprintf(logger_file, "%s| [%s] [%s][%s][%d]:%s\n", gettm(getTimeStamp()).c_str(), logLevel, file, func, iLine, output);
va_end(arglst);
}
private:
FILE* logger_file;
time_t getTimeStamp()
{
std::chrono::time_point<std::chrono::system_clock, std::chrono::milliseconds> tp = std::chrono::time_point_cast<std::chrono::milliseconds>(std::chrono::system_clock::now());
auto tmp = std::chrono::duration_cast<std::chrono::milliseconds>(tp.time_since_epoch());
time_t timestamp = tmp.count();
return timestamp;
}
string gettm(time_t timestamp)
{
//此处转化为东八区北京时间,如果是其它时区需要按需求修改
time_t milli = timestamp+ (time_t)8 * 60 * 60 * 1000;
auto mTime = std::chrono::milliseconds(milli);
auto tp = std::chrono::time_point<std::chrono::system_clock, std::chrono::milliseconds>(mTime);
auto tt = std::chrono::system_clock::to_time_t(tp);
tm* ptm = gmtime(&tt);
char date[128] = { 0 };
sprintf(date, "%d-%02d-%02d %02d:%02d:%02d .%03d",
(int)ptm->tm_year + 1900, (int)ptm->tm_mon + 1, (int)ptm->tm_mday,
(int)ptm->tm_hour, (int)ptm->tm_min, (int)ptm->tm_sec, milli % 1000);
return std::string(date);
}
};
#include "logger_net.h"
using namespace chrono;
int main(int argc, char* argv[])
{
string filename = "..\\ctx.txt";
Logger::GetSingletonInstance()->init(filename);
while (true)
{
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
/*FATAL_LOG("fatal log test[%d], char[%s]", 0, "fatal");
WARN_LOG("warn log test[%d], char[%s]", 10002, "warn");
NOTICE_LOG("notice log test[%d], char[%s]", 100031, "notice");
INFO_LOG("info log test[%d], char[%s]", 10001, "info");*/
ERROR_LOG("error log test[%d], char[%s]", 10001, "error");
DEBUG_LOG("debug log test[%d], char[%s]", 10005, "debug");
//TRACE_LOG("trace log test[%d], info[%s]", 10006, "trace");
}
Logger::GetSingletonInstance()->uninit();
return 0;
}
原文:https://www.cnblogs.com/fishily/p/13385104.html