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

【项目二】C++高性能服务器开发——日志系统(日志器,日志级别,日志事件)

知识点备忘录

其实也没啥

操作记录

在乌邦图上写的,先是模仿sylar创建了目录
在这里插入图片描述
进入sylar文件夹,有今天写的log.h头文件
在这里插入图片描述
其中log_test.cpp是为了测试log.h能否正常运行建的,只是个测试文件
log.h写了三个类,日志级别,日志事件,日志器
log.h头文件如下:

#ifndef __SYLAR_LOG_H_
#define __SYLAR_LOG_H_

#include <string>
#include <stdint.h>
#include <memory>
#include <iostream>


//日志级别
class LogLevel{
public:
	enum Level{
		UNKNOW = 0,//未知
		DEBUG = 1,//调试
		INFO = 2,//普通
		WARN = 3,//警告
		ERROR = 4,//错误
		FATAL = 5//灾难
	};
};

//日志事件
//通常包含日志发生的具体信息
class LogEvent{
public:
	//一个智能指针
	typedef std::shared_ptr<LogEvent> ptr;
	//构造函数
	LogEvent(LogLevel::Level level//日志级别
		//日志发生源代码文件名,日志发生的源代码中的行号,自程序启动以来的时间
		, const char* file, int32_t line, uint32_t elapse
		//产生日志事件的线程ID,产生日志事件的协程ID,日志事件的时间戳
		, uint32_t thread_id, uint32_t fiber_id, uint64_t time);

	//成员函数
	//1.返回日志发生的源文件名
	const char* getFile() const {return m_file;}
	//2.返回日志发生的代码行号
	int32_t getLine() const {return m_line;}
	//3.返回日志事件发生的事件,单位ms
	uint32_t getElapse() const {return m_elapse;}
	//4.返回产生日志事件的线程ID
	uint32_t getThreadId() const {return m_threadId;}
	//5.返回产生日志事件的协程ID
	uint32_t getFiberId() const {return m_fiberId;}
	//6.返回日志事件的时间戳
	uint64_t getTime() const {return m_time;}
	//7.返回日志事件的级别
	LogLevel::Level getLevel() const {return m_level;}

private:
	const char* m_file = nullptr;//表示日志事件的源文件名
	int32_t m_line = 0;//表示在源文件中的行号
	uint32_t m_elapse = 0;//表示程序启动到现在的ms
	uint32_t m_threadId = 0;//表示产生日志事件的线程ID
	uint32_t m_fiberId = 0;//表示产生日志事件的协程ID
	uint64_t m_time;//表示日志事件产生的时间戳
	LogLevel::Level m_level;//表示日志级别
};

//日志构造函数的实现
LogEvent::LogEvent(LogLevel::Level level
		, const char* file, int32_t line, uint32_t elapse
		, uint32_t thread_id, uint32_t fiber_id, uint64_t time)
	:m_level(level)
	,m_file(file)
	,m_line(line)
	,m_elapse(elapse)
	,m_threadId(thread_id)
	,m_fiberId(fiber_id)
	,m_time(time){
}


//日志器
class Logger{
public:
	//定义智能指针,操作Logger的对象
	typedef std::shared_ptr<Logger> ptr;
	//构造函数
	//未指定则给个默认名称root,这里引用生为了避免不必要的拷贝操作,使用const是为了规定这个名称在内部不会被改变
	Logger(const std::string& name = "root");

	//成员函数
	const std::string& getName() const {return m_name;}
	LogLevel::Level getLevel() const {return m_level;}
	void setLevel(LogLevel::Level val) {m_level = val;}

	//定义一个输出日志的方法,传入想要查看的最大日志级别
	void log(LogEvent::ptr event);
private:
	//m_开头生一个私有变量的规范
	std::string m_name;
	//日志器能输出的最大日志级别
	LogLevel::Level m_level;
};
//实现构造函数
Logger::Logger(const std::string& name)
	:m_name(name)
	//这里指定日志器一个自身默认级别是DEBUG
	,m_level(LogLevel::DEBUG){
}
//实现成员函数log()即输出方法
void Logger::log(LogEvent::ptr event){
	if(event->getLevel() >= m_level)
		std::cout << "日志输出模拟" << std::endl;
}

#endif

log_test.cpp文件如下

#include "log.h"
//测试
int main(int argc, char** argv){
        //创建一个日志事件
        LogEvent::ptr event(new LogEvent(LogLevel::WARN, 0, 1, 2, 3, 4, time(0)));
        Logger::ptr lg(new Logger("hkq"));
        lg->log(event);
        lg->setLevel(LogLevel::ERROR);
        lg->log(event);
        return 0;
}

正常打印输出了日志输出模拟,运行成功


http://www.kler.cn/news/293611.html

相关文章:

  • 2024高教杯数学建模B题思路
  • shell编程--正则表达式
  • SAP ABAP 程序迁移工具 SAPLINK ABAP GIT
  • Oracle 19c数据库:Windows详细安装与配置指南
  • 【操作系统】进程同步之共享内存
  • [dp]答疑
  • 0.ffmpeg面向对象oopc
  • 进程间通信与管道
  • 如何在Excel中创建一个VBA宏,并设置一个按钮来执行这个宏
  • AWS账号关闭后的影响:您需要知道的一切
  • AWTK HTML View 控件更新
  • 机器学习如何用于音频分析?
  • Unity中使用四元数限制旋转
  • 在目标检测模型中使用正样本和负样本组成的损失函数。
  • 区块链技术介绍
  • 消息可靠投递
  • 数据赋能(199)——开发:数据开发管理——概述、关注焦点
  • 批量文件编码转换用python实现的utf8转gb2312,vscode设置特殊文件的默认打开编码
  • 数据赋能(198)——开发:数据应用——技术方法、主要工具
  • DAY69
  • vue , 微信小程序 , uni-app绑定变量属性
  • 【2024】MySQL库表基本操作
  • 算法:图片压缩算法【Z字行扫描】(Java实现)
  • 相亲交友系统商业开发
  • 【最新华为OD机试E卷-支持在线评测】分糖果(100分)-多语言题解-(Python/C/JavaScript/Java/Cpp)
  • 用ACF和PACF计算出一堆数据的周期个数以及周期时长,数据分析python
  • Linux系统练习笔记【完整版】
  • .NET/C#⾯试题汇总系列:⾯向对象
  • SpringBoot整合openApi
  • 数据分析的革命:Docker容器化在数据分析中的应用