代码拉取完成,页面将自动刷新
#pragma once
#include <iostream>
#include <stdarg.h>
#include <ctime>
#include<sys/types.h>
#include<sys/stat.h>
#include<sys/fcntl.h>
#include<unistd.h>
#define Info 0
#define Debug 1
#define Warning 2
#define Error 3
#define Fatal 4
#define SIZE 1024
#define Screen 1
#define Onefile 2
#define Classfile 3
#define LogFile "log.txt"
class Log
{
public:
Log()
{
printMethod = Screen;
path = "./log/";
}
void Enable(int method)
{
printMethod = method;
}
std::string levelToString(int level)
{
switch(level)
{
case Info:
return "Info";
case Debug:
return "Debug";
case Warning:
return "Warning";
case Error:
return "Error";
case Fatal:
return "Fatal";
default:
return "None";
}
}
void printLog(int level, std::string logtxt)
{
switch(printMethod)
{
case Screen:
std::cout << logtxt;
break;
case Onefile:
printOnefile(LogFile, logtxt);
break;
case Classfile:
printClassfile(level, logtxt);
break;
default:
break;
}
}
void printOnefile(const std::string &logName, const std::string &logtxt)
{
std::string _logName = path + logtxt;
int fd = open(_logName.c_str(), O_CREAT | O_WRONLY | O_APPEND, 0666);
if(fd < 0) return;
write(fd,logtxt.c_str(),logtxt.size());
close(fd);
}
void printClassfile(int level, std::string logtxt)
{
std::string fileNmae = LogFile;
fileNmae += ".";
fileNmae += levelToString(level);
printOnefile(fileNmae,logtxt);
}
void operator()(int level, const char *format, ...) // 可变参数
{
time_t t = time(nullptr);
struct tm *ctime = localtime(&t);
char leftbuffer[SIZE] = {0};
snprintf(leftbuffer, sizeof(leftbuffer), "[%s][%d-%d-%d-%d:%d:%d]",levelToString(level).c_str(),
ctime->tm_year+1900,ctime->tm_mon+1,ctime->tm_mday,
ctime->tm_hour,ctime->tm_min,ctime->tm_sec);
va_list s;
va_start(s,format);
char rightbuffer[SIZE]={0};
vsnprintf(rightbuffer,sizeof(rightbuffer),format,s);
va_end(s);
//日志格式:默认+自定义部分
char logtxt[SIZE]={0};
snprintf(logtxt,sizeof(logtxt),"%s %s\n",leftbuffer,rightbuffer);
//std::cout << logtxt << std::endl;
printLog(level,logtxt);
// std::cout << time(nullptr) << std::endl;
}
~Log()
{}
private:
int printMethod;
std::string path;
};
//////////////////////////////////////////////////////
/* 形参从右向左入栈
n最后入栈实例化
可变参数列表必须要有一个实参,用于找到起始地址
栈 自顶向下 高地址 --> 低地址
*/
//////////////////////////////////////////////////////
// n代表有几个值
void sum(int n, ...)
{
va_list s; // char*
va_start(s, n);
int sum = 0;
while (n)
{
sum += va_arg(s, int);
n--;
}
va_end(s); // s = nullptr
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。