sylar
視頻教程地址
- C++服務(wù)器框架01_日志系統(tǒng)01
- C++服務(wù)器框架02_日志系統(tǒng)02_logger
- C++服務(wù)器框架03_日志系統(tǒng)03_appender
- C++服務(wù)器框架04_日志系統(tǒng)04_formatter
- C++服務(wù)器框架05_日志系統(tǒng)05_formatter2
- C++服務(wù)器框架06_日志系統(tǒng)06_編譯調(diào)試
- C++服務(wù)器框架07_日志系統(tǒng)07_完善日志系統(tǒng)
- C++服務(wù)器框架08_日志系統(tǒng)08_完善日志系統(tǒng)2
- C++服務(wù)器框架09_配置系統(tǒng)01_基礎(chǔ)配置
- C++服務(wù)器框架10_配置系統(tǒng)02_yaml
- C++服務(wù)器框架11_配置系統(tǒng)03_yaml整合
- C++服務(wù)器框架12_配置系統(tǒng)04_復(fù)雜類型的支持
- C++服務(wù)器框架13_配置系統(tǒng)05_更多stl容器支持
- C++服務(wù)器框架14_配置系統(tǒng)06_自定義類型的支持
- C++服務(wù)器框架15_配置系統(tǒng)07_配置變更事件
- C++服務(wù)器框架16_配置系統(tǒng)08_日志系統(tǒng)整合01
- C++服務(wù)器框架17_配置系統(tǒng)09_日志系統(tǒng)整合02
- C++服務(wù)器框架18_配置系統(tǒng)10_日志系統(tǒng)整合03
開發(fā)環(huán)境
Centos7
gcc 9.1
cmake
vim
項(xiàng)目路徑
bin -- 二進(jìn)制
build -- 中間文件路徑
cmake -- cmake函數(shù)文件夾
CMakeLists.txt -- cmake的定義文件
lib -- 庫的輸出路徑
Makefile
sylar -- 源代碼路徑
tests -- 測(cè)試代碼
日志系統(tǒng)
1)
仿照Log4J定義結(jié)構(gòu)
Logger (定義日志類別)
|
|-------Formatter(日志格式)----- FormatterItem
|
Appender(日志輸出地方)
|
------------------------
| |
FileLogAppender StdoutLogAppender
配置系統(tǒng)
Config --> Yaml
yamp-cpp: github 搜
mkdir build && cd build && cmake .. && make install
YAML::Node node = YAML::LoadFile(filename);
node.IsMap()
for(auto it = node.begin();
it != node.end(); ++it) {
it->first, it->second
}
node.IsSequence()
for(size_t i = 0; i < node.size(); ++i) {
}
node.IsScalar();
配置系統(tǒng)的原則,約定優(yōu)于配置:
template<T, FromStr, ToStr>
class ConfigVar;
template<F, T>
LexicalCast;
//容器片特化,目前支持vector
//list, set, map, unordered_set, unordered_map
// map/unordered_set 支持key = std::string
// Config::Lookup(key) , key相同, 類型不同的,不會(huì)有報(bào)錯(cuò)。這個(gè)需要處理一下
自定義類型,需要實(shí)現(xiàn)sylar::LexicalCast,片特化
實(shí)現(xiàn)后,就可以支持Config解析自定義類型,自定義類型可以和常規(guī)stl容器一起使用。
配置的事件機(jī)制
當(dāng)一個(gè)配置項(xiàng)發(fā)生修改的時(shí)候,可以反向通知對(duì)應(yīng)的代碼,回調(diào)
日志系統(tǒng)整合配置系統(tǒng)
logs:
- name: root
level: (debug,info,warn,error,fatal)
formatter: '%d%T%p%T%t%m%n'
appender:
- type: (StdoutLogAppender, FileLogAppender)
level:(debug,...)
file: /logs/xxx.log
sylar::Logger g_logger = sylar::LoggerMgr::GetInstance()->getLogger(name);
SYLAR_LOG_INFO(g_logger) << "xxxx log";
static Logger::ptr g_log = SYLAR_LOG_NAME("system"); //m_root, m_system-> m_root 當(dāng)logger的appenders為空,使用root寫logger
//定義LogDefine LogAppenderDefine, 偏特化 LexicalCast,
//實(shí)現(xiàn)日志配置解析
遺留問題:
- appender定義的formatter讀取yaml的時(shí)候,沒有被初始化
- 去掉額外的調(diào)試日志