【项目二】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;
}
正常打印输出了日志输出模拟,运行成功