logger.cpp 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. #include "logging/logger.hpp"
  2. #include <spdlog/sinks/basic_file_sink.h>
  3. namespace smartbotic::logging {
  4. std::shared_ptr<spdlog::logger> Logger::defaultLogger_ = nullptr;
  5. bool Logger::initialized_ = false;
  6. void Logger::init(const LogConfig& config) {
  7. if (initialized_) {
  8. return;
  9. }
  10. std::vector<spdlog::sink_ptr> sinks;
  11. // Console sink
  12. if (config.console) {
  13. auto console_sink = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();
  14. console_sink->set_level(static_cast<spdlog::level::level_enum>(config.level));
  15. sinks.push_back(console_sink);
  16. }
  17. // File sink
  18. if (!config.file_path.empty()) {
  19. auto file_sink = std::make_shared<spdlog::sinks::rotating_file_sink_mt>(
  20. config.file_path, config.max_file_size, config.max_files);
  21. file_sink->set_level(static_cast<spdlog::level::level_enum>(config.level));
  22. sinks.push_back(file_sink);
  23. }
  24. // Create logger
  25. defaultLogger_ = std::make_shared<spdlog::logger>(config.name, sinks.begin(), sinks.end());
  26. defaultLogger_->set_level(static_cast<spdlog::level::level_enum>(config.level));
  27. defaultLogger_->set_pattern(config.pattern);
  28. // Register as default
  29. spdlog::set_default_logger(defaultLogger_);
  30. spdlog::flush_every(std::chrono::seconds(3));
  31. initialized_ = true;
  32. }
  33. void Logger::shutdown() {
  34. if (initialized_) {
  35. spdlog::shutdown();
  36. defaultLogger_.reset();
  37. initialized_ = false;
  38. }
  39. }
  40. std::shared_ptr<spdlog::logger> Logger::get(const std::string& name) {
  41. if (!initialized_) {
  42. // Initialize with defaults if not already initialized
  43. init(LogConfig{});
  44. }
  45. if (name.empty()) {
  46. return defaultLogger_;
  47. }
  48. auto logger = spdlog::get(name);
  49. if (!logger) {
  50. // Create a new logger with same sinks as default
  51. logger = defaultLogger_->clone(name);
  52. spdlog::register_logger(logger);
  53. }
  54. return logger;
  55. }
  56. void Logger::setLevel(LogLevel level) {
  57. if (defaultLogger_) {
  58. defaultLogger_->set_level(static_cast<spdlog::level::level_enum>(level));
  59. }
  60. }
  61. void Logger::flush() {
  62. if (defaultLogger_) {
  63. defaultLogger_->flush();
  64. }
  65. }
  66. ScopedLogger::ScopedLogger(const std::string& component)
  67. : logger_(Logger::get(component)) {}
  68. } // namespace smartbotic::logging