1. LogManager 类封装
目的:构建一个管理日志器的”池”,能够管理输出不同地方的日志器,或者拥有不同权限的日志器。
* 置为单例对象
typedef kit_server::Single<LogManager> LoggerMgr;
1.1 成员变量
class LogManager
{
...
...
private:
//建立名字和日志器的映射关系
std::map<std::string, Logger::ptr> s_loggers;
//默认日志器
Logger::ptr m_root;
//互斥锁
MutexType m_mutex;
};
1.2 接口
1.2.1 构造函数
/**
* @brief 日志管理器类构造函数
*/
LogManager();
LogManager::LogManager()
{
//生成一个默认的Logger 并且配置一个默认的LogAppender 输出到控制台
m_root.reset(new Logger);
m_root->addAppender(LogAppender::ptr(new StdoutLogAppender));
//存入到容器中
s_loggers[m_root->getName()] = m_root;
}
1.2.2 getLogger()
功能:通过传入日志器的名称,获取具体的日志器对象智能指针
/**
* @brief 获取日志器
* @param[in] name 具体日志器名称
* @return Logger::ptr
*/
Logger::ptr getLogger(const std::string &name);
Logger::ptr LogManager::getLogger(const std::string &name)
{
//锁 map容器s_loggers
MutexType::Lock lock(m_mutex);
auto it = s_loggers.find(name);
if(it != s_loggers.end())
return it->second;
Logger::ptr logger(new Logger(name));
s_loggers[name] = logger;
//给新创建的日志器Logger一个
logger->setDefaultRoot(m_root);
return logger;
}
1.2.3 getRoot()
功能:获取默认的日志器
/**
* @brief 获取默认日志器root
* @return Logger::ptr
*/
Logger::ptr getRoot() const {return m_root;}
1.2.4 toYamlString()
功能:将所有日志器信息以yaml结点返回
/**
* @brief 将所有日志器信息以yaml结点返回
* @return YAML::Node
*/
YAML::Node toYamlString();
YAML::Node LogManager::toYamlString()
{
//锁 map容器s_loggers
MutexType::Lock lock(m_mutex);
YAML::Node node;
//将管理的所有日志器的信息打包到yaml结点中
for(auto &x : s_loggers)
{
node.push_back(YAML::Load(x.second->toYamlString()));
}
return node;
}
2. 将日志系统封装成便捷的宏调用
2.1 获取日志器
//通过单例LoggerMgr--->访问到LogManager中默认的Logger实例化对象
#define KIT_LOG_ROOT() kit_server::LoggerMgr::GetInstance()->getRoot()
//通过日志器的名字获取日志器实体
#define KIT_LOG_NAME(name) kit_server::LoggerMgr::GetInstance()->getLogger(name)
2.2 固定日志级别输出日志内容
/*固定日志级别输出日志内容*/
#define KIT_LOG_LEVEL(logger, level)\
if(logger->getLevel() <= level)\
kit_server::LogEventWrap(kit_server::LogEvent::ptr(new kit_server::LogEvent(logger, level, __FILE__, __LINE__, 0, kit_server::GetThreadId(), \
kit_server::GetThreadName(), kit_server::GetCoroutineId(), time(0)))).getSS()
#define KIT_LOG_DEBUG(logger) KIT_LOG_LEVEL(logger, kit_server::LogLevel::DEBUG)
#define KIT_LOG_INFO(logger) KIT_LOG_LEVEL(logger, kit_server::LogLevel::INFO)
#define KIT_LOG_WARN(logger) KIT_LOG_LEVEL(logger, kit_server::LogLevel::WARN)
#define KIT_LOG_ERROR(logger) KIT_LOG_LEVEL(logger, kit_server::LogLevel::ERROR)
#define KIT_LOG_FATAL(logger) KIT_LOG_LEVEL(logger, kit_server::LogLevel::FATAL)
2.3 带参日志输出日志内容
/*带参日志输出日志内容*/
#define KIT_LOG_FMT_LEVEL(logger, level, fmt, ...)\
if(level >= logger->getLevel())\
kit_server::LogEventWrap(kit_server::LogEvent::ptr(new kit_server::LogEvent(logger, level, __FILE__, __LINE__, 0, kit_server::GetThreadId(), kit_server::GetThreadName(), kit_server::GetCoroutineId(), time(0)))).getEvent()->format(fmt, __VA_ARGS__)
#define KIT_LOG_FMT_DEBUG(logger, fmt, ...) KIT_LOG_FMT_LEVEL(logger, kit_server::LogLevel::DEBUG, fmt, __VA_ARGS__)
#define KIT_LOG_FMT_INFO(logger, fmt, ...) KIT_LOG_FMT_LEVEL(logger, kit_server::LogLevel::INFO, fmt, __VA_ARGS__)
#define KIT_LOG_FMT_WARN(logger, fmt, ...) KIT_LOG_FMT_LEVEL(logger, kit_server::LogLevel::WARN, fmt, __VA_ARGS__)
#define KIT_LOG_FMT_ERROR(logger, fmt, ...) KIT_LOG_FMT_LEVEL(logger, kit_server::LogLevel::ERROR, fmt, __VA_ARGS__)
#define KIT_LOG_FMT_FATAL(logger, fmt, ...) KIT_LOG_FMT_LEVEL(logger, kit_server::LogLevel::FATAL, fmt, __VA_ARGS__)