1. LogManager 类封装

目的:构建一个管理日志器的”池”,能够管理输出不同地方的日志器,或者拥有不同权限的日志器。

* 置为单例对象

  1. typedef kit_server::Single<LogManager> LoggerMgr;

1.1 成员变量

  1. class LogManager
  2. {
  3. ...
  4. ...
  5. private:
  6. //建立名字和日志器的映射关系
  7. std::map<std::string, Logger::ptr> s_loggers;
  8. //默认日志器
  9. Logger::ptr m_root;
  10. //互斥锁
  11. MutexType m_mutex;
  12. };

1.2 接口

1.2.1 构造函数

  1. /**
  2. * @brief 日志管理器类构造函数
  3. */
  4. LogManager();
  5. LogManager::LogManager()
  6. {
  7. //生成一个默认的Logger 并且配置一个默认的LogAppender 输出到控制台
  8. m_root.reset(new Logger);
  9. m_root->addAppender(LogAppender::ptr(new StdoutLogAppender));
  10. //存入到容器中
  11. s_loggers[m_root->getName()] = m_root;
  12. }

1.2.2 getLogger()

功能:通过传入日志器的名称,获取具体的日志器对象智能指针

  1. /**
  2. * @brief 获取日志器
  3. * @param[in] name 具体日志器名称
  4. * @return Logger::ptr
  5. */
  6. Logger::ptr getLogger(const std::string &name);
  7. Logger::ptr LogManager::getLogger(const std::string &name)
  8. {
  9. //锁 map容器s_loggers
  10. MutexType::Lock lock(m_mutex);
  11. auto it = s_loggers.find(name);
  12. if(it != s_loggers.end())
  13. return it->second;
  14. Logger::ptr logger(new Logger(name));
  15. s_loggers[name] = logger;
  16. //给新创建的日志器Logger一个
  17. logger->setDefaultRoot(m_root);
  18. return logger;
  19. }

1.2.3 getRoot()

功能:获取默认的日志器

  1. /**
  2. * @brief 获取默认日志器root
  3. * @return Logger::ptr
  4. */
  5. Logger::ptr getRoot() const {return m_root;}

1.2.4 toYamlString()

功能:将所有日志器信息以yaml结点返回

  1. /**
  2. * @brief 将所有日志器信息以yaml结点返回
  3. * @return YAML::Node
  4. */
  5. YAML::Node toYamlString();
  6. YAML::Node LogManager::toYamlString()
  7. {
  8. //锁 map容器s_loggers
  9. MutexType::Lock lock(m_mutex);
  10. YAML::Node node;
  11. //将管理的所有日志器的信息打包到yaml结点中
  12. for(auto &x : s_loggers)
  13. {
  14. node.push_back(YAML::Load(x.second->toYamlString()));
  15. }
  16. return node;
  17. }

2. 将日志系统封装成便捷的宏调用

**Log.h**文件中

2.1 获取日志器

  1. //通过单例LoggerMgr--->访问到LogManager中默认的Logger实例化对象
  2. #define KIT_LOG_ROOT() kit_server::LoggerMgr::GetInstance()->getRoot()
  3. //通过日志器的名字获取日志器实体
  4. #define KIT_LOG_NAME(name) kit_server::LoggerMgr::GetInstance()->getLogger(name)

2.2 固定日志级别输出日志内容

  1. /*固定日志级别输出日志内容*/
  2. #define KIT_LOG_LEVEL(logger, level)\
  3. if(logger->getLevel() <= level)\
  4. kit_server::LogEventWrap(kit_server::LogEvent::ptr(new kit_server::LogEvent(logger, level, __FILE__, __LINE__, 0, kit_server::GetThreadId(), \
  5. kit_server::GetThreadName(), kit_server::GetCoroutineId(), time(0)))).getSS()
  6. #define KIT_LOG_DEBUG(logger) KIT_LOG_LEVEL(logger, kit_server::LogLevel::DEBUG)
  7. #define KIT_LOG_INFO(logger) KIT_LOG_LEVEL(logger, kit_server::LogLevel::INFO)
  8. #define KIT_LOG_WARN(logger) KIT_LOG_LEVEL(logger, kit_server::LogLevel::WARN)
  9. #define KIT_LOG_ERROR(logger) KIT_LOG_LEVEL(logger, kit_server::LogLevel::ERROR)
  10. #define KIT_LOG_FATAL(logger) KIT_LOG_LEVEL(logger, kit_server::LogLevel::FATAL)

2.3 带参日志输出日志内容

  1. /*带参日志输出日志内容*/
  2. #define KIT_LOG_FMT_LEVEL(logger, level, fmt, ...)\
  3. if(level >= logger->getLevel())\
  4. 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__)
  5. #define KIT_LOG_FMT_DEBUG(logger, fmt, ...) KIT_LOG_FMT_LEVEL(logger, kit_server::LogLevel::DEBUG, fmt, __VA_ARGS__)
  6. #define KIT_LOG_FMT_INFO(logger, fmt, ...) KIT_LOG_FMT_LEVEL(logger, kit_server::LogLevel::INFO, fmt, __VA_ARGS__)
  7. #define KIT_LOG_FMT_WARN(logger, fmt, ...) KIT_LOG_FMT_LEVEL(logger, kit_server::LogLevel::WARN, fmt, __VA_ARGS__)
  8. #define KIT_LOG_FMT_ERROR(logger, fmt, ...) KIT_LOG_FMT_LEVEL(logger, kit_server::LogLevel::ERROR, fmt, __VA_ARGS__)
  9. #define KIT_LOG_FMT_FATAL(logger, fmt, ...) KIT_LOG_FMT_LEVEL(logger, kit_server::LogLevel::FATAL, fmt, __VA_ARGS__)