日志:
日志时间,日志的等级,日志内容,文件的名称和行号
- Info:常规消息
- Warning:报警信息
- Error:必要严重了,可能需要立即处理
- Fatal:致命的
- Debug:调试
实现一个简单的日志函数
代码里面需要了解到的知识又可变参数列表
代码:
#pragma once
#include<iostream>
#include<stdarg.h>
#include<time.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<string>using namespace std;#define info 0
#define debug 1
#define warn 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="./";}void Enable(int method){printMethod=method;}std::string getlevel(int level){switch(level){case info:return "info";case debug:return "debug";case warn:return "warn";case error:return "error";case fatal:return "fatal";default:return "unknow";}}void logmessage(int level,char* format,...){time_t t=time(nullptr);struct tm* tm=localtime(&t);char left_buffer[SIZE];snprintf(left_buffer,sizeof(left_buffer),"%s [%d-%d-%d %d:%d:%d] ",getlevel(level).c_str(),format,\tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec);char right_buffer[SIZE];va_list s;va_start(s,format);char right_buffer[SIZE];vsnprintf(right_buffer,sizeof(right_buffer),format,s);va_end(s);char log_txt[SIZE];snprintf(log_txt,sizeof(log_txt),"%s%s",left_buffer,right_buffer);cout<<log_txt<<endl;// printf("[%d-%d-%d %d:%d:%d] ",// tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec);//日志的格式:默认部分+自定义部分//默认部分:[时间][文件:行号][日志级别]//自定义部分:日志内容}void printLog(int level,const string &logtxt){switch(printMethod){case Screen:cout<<logtxt<<endl;break;case OneFile:cout<<"print to one file"<<endl;PrintFile(logFile,logtxt);break;case ClassFile:cout<<"print to class file"<<endl;PrintClassFile(level,logtxt);break;}}void PrintFile(const string &logname,const string &logtxt){string _logname=_path+logname;int fd=open(_logname.c_str(),O_WRONLY|O_CREAT|O_APPEND,0664);if(fd<0)return;write(fd,logtxt.c_str(),logtxt.size());close(fd);}void PrintClassFile(int level ,const string &logtxt){string filename=logFile;filename+=".";filename+=getlevel(level);PrintFile(filename,logtxt);}
private:int printMethod;string _path;
};