截止Tars-C++ 揭秘篇:链接管理,我们已经解析了RPC的大部分代码(promise部分以后单独再说)。可能有同学说没还看到epoll模型和协程部分的介绍啊,其实这部分在TarsRPC源码解读篇:使用C++重写Tars-RPC主逻辑框架中的第一节和第三节有所提及,所以剩下的的可能只有日志部分了
Tars的日志部分是自己实现的,翻看了代码,额,怎么说,日志部分的代码对初学者有一点点不友好。
本着“死贫道,不死道友”的精神,笔者对日志类进行了简要梳理,希望对想要了解Tars日志类的同学有些帮助
如果想自己先梳理逻辑,可以按照下面的代码顺序进行
// setLogInfo中,初始化了线程池,放入具体任务,循环等待输入内容
TarsRollLogger::getInstance()->setLogInfo(ServerConfig::Application, ServerConfig::ServerName, ServerConfig::LogPath, ServerConfig::LogSize, ServerConfig::LogNum, _communicator, ServerConfig::Log);
//设置日志等级
TarsRollLogger::getInstance()->logger()->setLogLevel("DEBUG");
//放入具体内容, setLogInfo中等待的线程写入文件
TarsRollLogger::getInstance()->logger()->debug() << "[TARS]" << "HelloWorld" << endl;
这张图画的的确有点乱。。。请担待
贴一段验证代码,有助于理解5号黄色框__stream->flush调用LoggerBuffer的sync的逻辑
#include <iostream>
#include <string>
using namespace std;
class LoggerBuffer : public std::basic_streambuf<char>
{
public:
LoggerBuffer(int num){cout<<"LoggerBuffer init"<<endl;}
~LoggerBuffer(){cout<<"LoggerBuffer xigou"<<endl;}
virtual int sync(){cout<<"sync"<<endl;}
};
class TC_Logger
{
public:
TC_Logger()
:_buffer(1)
, _stream(&_buffer)
{}
~TC_Logger(){cout<<"TC_Logger xigou"<<endl;}
void stream(int level)
{
ostream *ost = NULL;
ost = &_stream;
//调用flush后会调用LoggerBuffer中的sync方法
ost->flush();
}
LoggerBuffer _buffer;
std::ostream _stream;
};
int main()
{
TC_Logger logger;
logger.stream(1);
cout<<"main fun end"<<endl;
return 0;
}
g++ main.cpp
执行./a.out,会看到执行过程
下面这张stream关系图,对理解上面LoggerBuffer变量和ostream之间关系有些帮助
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。