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

2024-09-07 08:20

本文主要是介绍【项目二】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.返回日志事件发生的事件,单位msuint32_t getElapse() const {return m_elapse;}//4.返回产生日志事件的线程IDuint32_t getThreadId() const {return m_threadId;}//5.返回产生日志事件的协程IDuint32_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;//表示程序启动到现在的msuint32_t m_threadId = 0;//表示产生日志事件的线程IDuint32_t m_fiberId = 0;//表示产生日志事件的协程IDuint64_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;
}

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

这篇关于【项目二】C++高性能服务器开发——日志系统(日志器,日志级别,日志事件)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1144554

相关文章

深度解析Java项目中包和包之间的联系

《深度解析Java项目中包和包之间的联系》文章浏览阅读850次,点赞13次,收藏8次。本文详细介绍了Java分层架构中的几个关键包:DTO、Controller、Service和Mapper。_jav... 目录前言一、各大包1.DTO1.1、DTO的核心用途1.2. DTO与实体类(Entity)的区别1

从入门到精通C++11 <chrono> 库特性

《从入门到精通C++11<chrono>库特性》chrono库是C++11中一个非常强大和实用的库,它为时间处理提供了丰富的功能和类型安全的接口,通过本文的介绍,我们了解了chrono库的基本概念... 目录一、引言1.1 为什么需要<chrono>库1.2<chrono>库的基本概念二、时间段(Durat

C++20管道运算符的实现示例

《C++20管道运算符的实现示例》本文简要介绍C++20管道运算符的使用与实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录标准库的管道运算符使用自己实现类似的管道运算符我们不打算介绍太多,因为它实际属于c++20最为重要的

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性:

mysql中的服务器架构详解

《mysql中的服务器架构详解》:本文主要介绍mysql中的服务器架构,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、mysql服务器架构解释3、总结1、背景简单理解一下mysqphpl的服务器架构。2、mysjsql服务器架构解释mysql的架

c++中的set容器介绍及操作大全

《c++中的set容器介绍及操作大全》:本文主要介绍c++中的set容器介绍及操作大全,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录​​一、核心特性​​️ ​​二、基本操作​​​​1. 初始化与赋值​​​​2. 增删查操作​​​​3. 遍历方

解析C++11 static_assert及与Boost库的关联从入门到精通

《解析C++11static_assert及与Boost库的关联从入门到精通》static_assert是C++中强大的编译时验证工具,它能够在编译阶段拦截不符合预期的类型或值,增强代码的健壮性,通... 目录一、背景知识:传统断言方法的局限性1.1 assert宏1.2 #error指令1.3 第三方解决

如何在Spring Boot项目中集成MQTT协议

《如何在SpringBoot项目中集成MQTT协议》本文介绍在SpringBoot中集成MQTT的步骤,包括安装Broker、添加EclipsePaho依赖、配置连接参数、实现消息发布订阅、测试接口... 目录1. 准备工作2. 引入依赖3. 配置MQTT连接4. 创建MQTT配置类5. 实现消息发布与订阅

C++11委托构造函数和继承构造函数的实现

《C++11委托构造函数和继承构造函数的实现》C++引入了委托构造函数和继承构造函数这两个重要的特性,本文主要介绍了C++11委托构造函数和继承构造函数的实现,具有一定的参考价值,感兴趣的可以了解一下... 目录引言一、委托构造函数1.1 委托构造函数的定义与作用1.2 委托构造函数的语法1.3 委托构造函

C++11作用域枚举(Scoped Enums)的实现示例

《C++11作用域枚举(ScopedEnums)的实现示例》枚举类型是一种非常实用的工具,C++11标准引入了作用域枚举,也称为强类型枚举,本文主要介绍了C++11作用域枚举(ScopedEnums... 目录一、引言二、传统枚举类型的局限性2.1 命名空间污染2.2 整型提升问题2.3 类型转换问题三、C