当前位置: 首页 > wzjs >正文

深圳html5网站建设宁波品牌网站推广优化

深圳html5网站建设,宁波品牌网站推广优化,软件开发流程图例子,富阳网站建设报价目录 一、前言 二、实现一个简单的日志 1.可变参数 2.日志等级 3.日志时间 4.打印每一条参数 5.合并两个缓冲区 6.封装日志函数 三、完整代码 一、前言 当我们写一个函数,例如打开文件open,当我们打开失败的时候,会调用perror看到错误…

目录

一、前言

二、实现一个简单的日志

1.可变参数

 2.日志等级

3.日志时间

4.打印每一条参数

5.合并两个缓冲区

6.封装日志函数

三、完整代码


一、前言

当我们写一个函数,例如打开文件open,当我们打开失败的时候,会调用perror看到错误信息。

接下来我们将带大家了解日志,并自主实现一个日志系统。

这个就是我们定义的日志类的对象。

二、实现一个简单的日志

我们运行代码的时候,我们希望有各种各样的运行时候的一些信息。这也就是日志

它一半有日志时间,日志的等级,日志的内容,文件的名称和行号。

对于日志等级一半有如下的

Info:常规消息

Warning:报警信息

Error:严重,可能要立即处理

Fatal:致命的

Ddbug:调试

1.可变参数

在写日志之前,我们了解一下可变参数列表

关于可变参数我们主要用下面四个中的前三个 

我们先来看一段代码

 

va_list s我们可以定义可以访问可变参数部分的变量,是char* 类型的。

va_start使其对象指向可变参数列表部分。

va_arg使用 va_arg 宏依次获取每个可变参数。

最后输出是正确的。

 2.日志等级

我们用宏定义

#define Info 0
#define Debug 1
#define Warning 2
#define Error 3
#define Fatal 4

3.日志时间

我们在用一个接口的时候,万一这个接口失败,我们要看在什么时间段出现了什么错误。

通过time接口获得时间戳。

但这个时间戳我们还要自己运算才能得到对应的年月日。

这里给大家介绍一个localtime时间类型转换函数。

这里返回的是一个名字叫tm的结构体

这里注意,mon月份从0月开始,year年份从1900年开始。

运行结果如下:

这里我们是直接打印到显示器上,但有时候我们写日志要写入到文件里,所以这个时候我们应该创建一个缓冲区,把时间先暂时放到缓冲区里。

4.打印每一条参数

我们可以用vsnprintf函数

这里我们要用到参数列表,我们把每一条参数写入到右缓冲区中。

5.合并两个缓冲区

我们把日志时间和日志参数全部写到另一个缓冲区里,如果要打印在屏幕上就直接打印,写在文件里,就把该缓冲区的数据写入。我们来测试一下。

我们这个时候已经完成了一个简易的日志系统。

接下来我们把这个函数封装一下形成一个类,我们有时候想把该日志打印到显示器,或者输出到一个文件中,或者多个文件中。

6.封装日志函数

这里我们创一个类Log

我们有时候既然想打印到显示器上或者一个文件里或者多个文件里时,我们要有一个成员变量OpenMethod,这个路径成员变量为了方便我们创建多个文件使用。

我们先把这个类的构造函数写了,我们默认是打印在显示器上的

再写两个成员函数,判断把日志写在哪里

我们先测试一下能不能打印在显示器上

#include <iostream>
#include <stdarg.h>
#include <ctime>
#include <string>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>#define SIZE 1024
#define Info 0
#define Debug 1
#define Warning 2
#define Error 3
#define Fatal 4using namespace std;
#define Screen 1
#define Onefile 2
#define Classfile 3#define LogFile "log.txt"class Log
{
public:Log(){OpenMethod=Screen;path="path->";}void ChoseMethod(int Method){ OpenMethod=Method;}string levelToString(int level){switch(level){case Info:return "Info";case Debug:return "Debug";case Warning:return "Warining";case Error:return "Error";case Fatal:return "Fatal";}}void printlog(int level, const std::string &logtxt){switch(OpenMethod){case Screen:std::cout << logtxt << std::endl;break;case Onefile:printOneFile(LogFile, logtxt);case Classfile:printClassFile(level, logtxt);break;default:break;}}void printOneFile(const std::string &logname, const std::string &logtxt ){string Filename=logname+path;int fd = open(Filename.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, const std::string &logtxt){}void logmessage(int level, const char *format, ...){//时间time_t t = time(nullptr);struct tm* ctime = localtime(&t);char leftbuffer[SIZE];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);//打印参数char rightbuffer[SIZE];va_list s;va_start(s,format);vsnprintf(rightbuffer,sizeof(rightbuffer),format,s);va_end(s);//合并char logtxt[SIZE*2];snprintf(logtxt,sizeof(logtxt),"%s %s",leftbuffer,rightbuffer);printlog(level,logtxt);}
private:int OpenMethod;string path;
}

结果显示

接下来我们把写在一个文件下和多个文件下的成员函数写了。

我们来运行一下看看。

确实是写入了。

测试一下多文件方法

 都打印到各个文件中。

我们在makefile里创建一个文件夹,在我们的path初始化找到这个log文件夹。

 

我们看看结果。

三、完整代码

#include <iostream>
#include <stdarg.h>
#include <ctime>
#include <string>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>#define SIZE 1024
#define Info 0
#define Debug 1
#define Warning 2
#define Error 3
#define Fatal 4using namespace std;
#define Screen 1
#define Onefile 2
#define Classfile 3#define LogFile "log.txt"class Log
{
public:Log(){OpenMethod=Screen;path = "./log/";}void ChoseMethod(int Method){ OpenMethod=Method;}string levelToString(int level){switch(level){case Info:return "Info";case Debug:return "Debug";case Warning:return "Warining";case Error:return "Error";case Fatal:return "Fatal";}}void printlog(int level, const std::string &logtxt){switch(OpenMethod){case Screen:std::cout << logtxt << std::endl;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 ){string Filename = path + logname;int fd = open(Filename.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, const std::string &logtxt){std::string filename = LogFile;filename += ".";filename += levelToString(level); // "log.txt.Debug/Warning/Fatal"printOneFile(filename, logtxt);}void logmessage(int level, const char *format, ...){//时间time_t t = time(nullptr);struct tm* ctime = localtime(&t);char leftbuffer[SIZE];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);//打印参数char rightbuffer[SIZE];va_list s;va_start(s,format);vsnprintf(rightbuffer,sizeof(rightbuffer),format,s);va_end(s);//合并char logtxt[SIZE*2];snprintf(logtxt,sizeof(logtxt),"%s %s",leftbuffer,rightbuffer);printlog(level,logtxt);}
private:int OpenMethod;string path;
};

http://www.dtcms.com/wzjs/60274.html

相关文章:

  • 门户网站和搜索网站的区别企业seo推广
  • 网站制作收费百度浏览器广告怎么投放
  • 花卉网站建设策划书漯河搜狗关键词优化排名软件
  • 沛县可以做网站的单位公司网站设计图
  • zencart网站武汉网站竞价推广
  • 优秀网站建设评选活动海报wordpress官网入口
  • 东营市做网站网络广告网站
  • 生活分类信息网站大全电商平台怎么注册
  • 老域名购买优化关键词的作用
  • 公司网站开发之main区域(2)软文营销的特点有哪些
  • 物流公司做网站注重什么全网推广费用
  • 网站上的东西不能复制粘贴新品上市怎么做宣传推广
  • 俄语网站建设北京网络营销咨询公司
  • 把网站做静态化长沙企业seo优化
  • 网站要不要备案网络推广员工资多少钱
  • 北京网络电话长沙seo外包
  • 做什么网站最赚钱官方网站怎么查询
  • 做直播网站需要证书吗济南做网站公司
  • 网站建设会计分录怎么做如何做好网站推广优化
  • 网络设计实践课程报告seo的工作原理
  • lsp必备公众号广州百度首页优化
  • 建设厅考试成绩查询搜狗seo刷排名软件
  • 无版权图片做网站奶茶店推广软文500字
  • nodejsweb网站开发查图百度识图
  • php怎么做直播网站吗正规网站优化哪个公司好
  • 做影视网站风险大吗网站关键词查询
  • 网站设计云匠网网络营销的步骤
  • 学校网站建设要求aso安卓优化
  • 做网站建设有哪些公司好排名优化网站建设
  • 给企业做网站推广好么软文推广例子