tlogger.cpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. #include "tlogger.h"
  2. #include <iomanip>
  3. #include <iostream>
  4. namespace TC {
  5. // ConsoleOutput实现
  6. void ConsoleOutput::write(LogLevel level, const std::string& message)
  7. {
  8. std::ostream& stream = (level >= LogLevel::WARNING) ? std::cerr : std::cout;
  9. stream << message << std::endl;
  10. stream.flush();
  11. }
  12. // FileOutput实现
  13. FileOutput::FileOutput(const std::string& filename)
  14. {
  15. m_file.open(filename, std::ios::app);
  16. if (!m_file.is_open()) {
  17. std::cerr << "Failed to open log file: " << filename << std::endl;
  18. }
  19. }
  20. FileOutput::~FileOutput()
  21. {
  22. if (m_file.is_open()) {
  23. m_file.close();
  24. }
  25. }
  26. void FileOutput::write(LogLevel level, const std::string& message)
  27. {
  28. std::lock_guard<std::mutex> lock(m_mutex);
  29. if (m_file.is_open()) {
  30. m_file << message << std::endl;
  31. m_file.flush();
  32. }
  33. }
  34. // Logger实现
  35. Logger& Logger::instance()
  36. {
  37. static Logger instance;
  38. return instance;
  39. }
  40. void Logger::setLevel(LogLevel level)
  41. {
  42. std::lock_guard<std::mutex> lock(m_mutex);
  43. m_level = level;
  44. }
  45. LogLevel Logger::getLevel() const
  46. {
  47. std::lock_guard<std::mutex> lock(m_mutex);
  48. return m_level;
  49. }
  50. void Logger::addOutput(std::unique_ptr<LogOutput> output)
  51. {
  52. std::lock_guard<std::mutex> lock(m_mutex);
  53. m_outputs.push_back(std::move(output));
  54. }
  55. void Logger::clearOutputs()
  56. {
  57. std::lock_guard<std::mutex> lock(m_mutex);
  58. m_outputs.clear();
  59. }
  60. void Logger::debug(const std::string& message)
  61. {
  62. if (shouldLog(LogLevel::DEBUG)) {
  63. log(LogLevel::DEBUG, message);
  64. }
  65. }
  66. void Logger::info(const std::string& message)
  67. {
  68. if (shouldLog(LogLevel::INFO)) {
  69. log(LogLevel::INFO, message);
  70. }
  71. }
  72. void Logger::warning(const std::string& message)
  73. {
  74. if (shouldLog(LogLevel::WARNING)) {
  75. log(LogLevel::WARNING, message);
  76. }
  77. }
  78. void Logger::error(const std::string& message)
  79. {
  80. if (shouldLog(LogLevel::ERROR)) {
  81. log(LogLevel::ERROR, message);
  82. }
  83. }
  84. void Logger::initialize(const std::string& logFile,
  85. LogLevel level,
  86. bool enableConsole,
  87. bool enableQt)
  88. {
  89. Logger& logger = instance();
  90. logger.clearOutputs();
  91. logger.setLevel(level);
  92. // 添加文件输出
  93. if (!logFile.empty()) {
  94. logger.addOutput(std::make_unique<FileOutput>(logFile));
  95. }
  96. // 添加控制台输出
  97. if (enableConsole) {
  98. logger.addOutput(std::make_unique<ConsoleOutput>());
  99. }
  100. logger.info("AV Logger initialized");
  101. }
  102. void Logger::log(LogLevel level, const std::string& message)
  103. {
  104. std::lock_guard<std::mutex> lock(m_mutex);
  105. std::string formattedMessage = getCurrentTime() + " [" + levelToString(level) + "] " + message;
  106. for (auto& output : m_outputs) {
  107. if (output) {
  108. output->write(level, formattedMessage);
  109. }
  110. }
  111. }
  112. bool Logger::shouldLog(LogLevel level) const
  113. {
  114. return level >= m_level;
  115. }
  116. std::string Logger::getCurrentTime() const
  117. {
  118. auto now = std::chrono::system_clock::now();
  119. auto time_t = std::chrono::system_clock::to_time_t(now);
  120. auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch()) % 1000;
  121. std::ostringstream oss;
  122. oss << std::put_time(std::localtime(&time_t), "%Y-%m-%d %H:%M:%S");
  123. oss << '.' << std::setfill('0') << std::setw(3) << ms.count();
  124. return oss.str();
  125. }
  126. std::string Logger::levelToString(LogLevel level) const
  127. {
  128. switch (level) {
  129. case LogLevel::DEBUG:
  130. return "DEBUG";
  131. case LogLevel::INFO:
  132. return "INFO";
  133. case LogLevel::WARNING:
  134. return "WARN";
  135. case LogLevel::ERROR:
  136. return "ERROR";
  137. default:
  138. return "UNKNOWN";
  139. }
  140. }
  141. } // namespace TC