Sylar C++高性能服务器学习记录02 【日志管理-代码分析篇】
早在19年5月就在某站上看到sylar的视频了,一直认为这是一个非常不错的视频。
由于本人一直是自学编程,基础不扎实,也没有任何人的督促,没能坚持下去。
每每想起倍感惋惜,遂提笔再续前缘。
为了能更好的看懂sylar,本套笔记会分两步走,每个系统都会分为两篇博客。
分别是【知识储备篇】和【代码分析篇】
(ps:纯粹做笔记的形式给自己记录下,欢迎大家评论,不足之处请多多赐教)
QQ交流群:957100923
本篇内容很细,与原有代码有偏差,带有自己理解的情况下编写的代码。
本文重在 “思考如何思考”,这样才能把知识消化在自己的 “胃” 里
当然这里时刻提醒自己要做 “黄昏中起飞的猫头鹰”
日志管理-代码分析
1.类图概括
首先列出日志系统中的类,这里只是简单列出大致的关系并不是最正确的"类图"(或者算不上"类图")
列出这张图意在有一个大致的了解,便于后续的理解。
2.明确目的
想必大家都感觉某站上的视频难啃吧。除了视频声音较小之外更重要的是UP主在讲解时并没有先说明要做什么,要做成什么样,也就是大家不明白目的是什么。导致视频开始时处于一脸懵的状态,没熬到最后就不知道在说什么。最近看到一个视频是关于雷军的,大致意思是:“我读书时也有不懂得地方,直接跳过,通篇读完会恍然大悟,然后再读一边。” 这句话多少给了我点动力,所以打算开始写这一系列的博客。
言归正传,日志系统无非就是:
需要一个方法输出指定的信息方便我们观察程序的运行状态
最简单的方法:
//c++ 风格日志输出
std::cout = m_level){
std::cout log(event); //日志输出模拟
//将日志器级别改为ERROR
lg->setLevel(LogLevel::ERROR);
//此时 WARNlog(event);
return 0;
}
接下来我们再来思考,以上代码关于级别的已经初步处理了,我们还缺少什么?
是的 没错 线上环境不仅仅是将日志打印在控制台,还需要能打印到本地磁盘,或者远程日志服务器等等。
所以我们需要在Logger类中进行设计,起码需要有两种类型的“适配器”来承接各自的业务。
1.一个适配器负责打印日志到控制台 StdoutLogAppender
2.另一个负责打印到本地磁盘文件 FileLogAppender
3.为了未来的扩展性,所以这里要抽象一个基类来实现多态 LogAppender
编写适配器基类:LogAppender
所以接下来思考,LogAppender类需要什么。
0.是否需要私有字段 (目前好像不需要)
1.是否需要智能指针 (明显这个类是需要使用该类指针指向子类对象的所以肯定需要)
2.是否需要有参构造 (目前好像不需要)
3.是否需要析构函数 (应该是需要的,因为这个是基类需要被继承,不仅仅要析构函数,还要虚析构!!!)
4.是否需要get/set方法 (目前好像不需要,连私有字段都没更不用get/set了)
5.是否需要什么方法 (应该是需要的,起码要一个日志输出的方法而且没有实现体,应该定义为纯虚函数)
好!老办法开始写:
class LogAppender{
public:
//定义智能指针
typedef std::shared_ptr ptr;
//虚析构 空函数没有复杂逻辑所以 直接定义掉
virtual ~LogAppender(){}
//输出函数为纯虚函数,因为具体实现各个子类不一样,由各个子类自己决定
virtual void log(LogEvent::ptr event) = 0;
};
编写输出到控制台适配器类:StdoutLogAppender
//输出到控制台的Appender
class StdoutLogAppender : public LogAppender {
public:
typedef std::shared_ptr ptr;
//这里的override用于表示是重写父类方法的
void log(LogEvent::ptr event) override;
};
void StdoutLogAppender::log(LogEvent::ptr event){
std::cout 
