日志系统第七弹:日志宏模块与项目测试和总结
一、日志宏模块的实现
1.日志系统的不足
在实现完日志器模块之后,我们已经可以完整的 支持:同步/异步,多落地方向,自定义日志格式的打印了
换言之,我们的日志系统已经大功告成了:
对于局部日志器来说,打印日志搞成最简单的模式:
标准输出+默认格式+默认限制输出等级+默认同步/异步模式
// 局部日志器打印
void test1()
{
LoggerBuilder::ptr builder = std::make_shared<LocalLoggerBuilder>();
// 设置日志器名称
builder->buildLoggerName("local_logger");
// 构造并获取日志器
Logger::ptr logger = builder->build();
// 正式打印日志
logger->debug(__FILE__, __LINE__, "%s:%d", "DEBUG", 1);
logger->info(__FILE__, __LINE__, "%s:%d", "INFO", 1);
logger->warning(__FILE__, __LINE__, "%s:%d", "WARNING", 1);
logger->error(__FILE__, __LINE__, "%s:%d", "ERROR", 1);
logger->fatal(__FILE__, __LINE__, "%s:%d", "FATAL", 1);
}
对于全局日志器来说:如果没有特殊需求的话,直接用全局的default_logger就可以
void test2()
{
Logger::ptr logger = LoggerManager::getInstance().default_logger();
logger->debug(__FILE__, __LINE__, "%s:%d", "DEBUG", 1);
logger->info(__FILE__, __LINE__, "%s:%d", "INFO", 1);
logger->warning(__FILE__, __LINE__, "%s:%d", "WARNING", 1);
logger->error(__FILE__, __LINE__, "%s:%d", "ERROR", 1);
logger->fatal(__FILE__, __LINE__, "%s:%d", "FATAL", 1);
}
打印日志的地方:这个__FILE__和__LINE__每次打印都要带上
非常不优雅:因此我们可以封装一个宏来代理打印
int main()
{
test1();
std::cout<<std::string(100,'-')<<"\n";
test2();
return 0;
}
2.改进
1.日志打印宏
如果使用函数的话,那么打印日志的__FILE__和__LINE__就会变为函数对应文件和行号了
因此我们只能使用宏(因为宏是替换到调用位置的)
因此,我们可以写出如下的宏:
#define debug(format,...) debug(__FILE__,__LINE__,format,##__VA_ARGS__)
#define info(format,...) info(__FILE__,__LINE__,format,##__VA_ARGS__)
#define warning(format,...) warning(__FILE__,__LINE__,format,##__VA_ARGS__)
#define error(format,...) error(__FILE__,__LINE__,format,##__VA_ARGS__)
#define fatal(format,...) fatal(__FILE__,__LINE__,format,##__VA_ARGS__)
2.获取全局日志器宏
为了方便用户使用, 避免用户直接操作单例对象,我们可以给两个接口:
Logger::ptr getLogger(const std::string &logger_name)
{
return LoggerManager::getInstance().getLogger(logger_name);
}
Logger::ptr defaultLogger()
{
return LoggerManager::getInstance().default_logger();
}
3.默认日志器打印宏
为了方便用户使用默认日志器,我们也提供一个宏
// 默认日志器打印宏
#define default_debug(format, ...) ns_log::getDefaultLogger()->debug(format, ##__VA_ARGS__)
#define default_info(format, ...) ns_log::getDefaultLogger()->info(format, ##__VA_ARGS__)
#define default_warning(format, ...) ns_log::getDefaultLog