LHLog_file_sink.h 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. #ifndef LHLOG_FILE_SINK_H
  2. #define LHLOG_FILE_SINK_H
  3. /**
  4. * @file LHLog_file_sink.h
  5. * @author your name (you@domain.com)
  6. * @brief 自定义的日志输出管道,输出到LHQLog中,由他写入文件
  7. * @version 0.1
  8. * @date 2024-07-18
  9. *
  10. * @copyright Copyright (c) 2024
  11. *
  12. */
  13. #include "spdlog/common.h"
  14. #include "spdlog/details/log_msg.h"
  15. #include "spdlog/details/synchronous_factory.h"
  16. #include "spdlog/sinks/base_sink.h"
  17. #include <array>
  18. #include "LHQLogAPI.h"
  19. #include <QString>
  20. #include <QDebug>
  21. namespace spdlog {
  22. namespace sinks {
  23. template<typename Mutex>
  24. class LHLog_file_sink : public base_sink<Mutex>
  25. {
  26. public:
  27. /**
  28. * @brief Construct a new lhlog file sink object
  29. *
  30. * @param lhLog LHLog实例
  31. * @param labName 需要加载的库名
  32. * @param strLogName 日志模块名称
  33. */
  34. LHLog_file_sink(CLHQLogApi* lhLog, QString labName, QString strLogName) :
  35. m_lhLog(lhLog),
  36. m_libName(labName),
  37. m_strLogName(strLogName)
  38. {
  39. if(m_lhLog != nullptr)
  40. {
  41. m_lhLog->Load(labName);
  42. m_lhLog->DoInitial(strLogName);
  43. }
  44. }
  45. ~LHLog_file_sink() override = default;
  46. protected:
  47. /* 关键函数,从这里获取数据 */
  48. void sink_it_(const details::log_msg &msg) override {
  49. /* 获取输出等级 */
  50. level::level_enum msgLevel = msg.level;
  51. /* 内存中的数据 */
  52. memory_buf_t formatted;
  53. /* 从msg原始数据经过变换,处理通配符相关的东西,好像是处理啥指针问题? */
  54. base_sink<Mutex>::formatter_->format(msg, formatted);
  55. /* 去掉结尾的换行符 */
  56. auto size = formatted.size();
  57. // qDebug() << "formatted.size() = " << formatted.size();
  58. if(size >= 2 && ( formatted[size - 1] == '\n' ) && ( formatted[size - 2] == '\r') )
  59. {
  60. formatted.resize(size - 2);
  61. }
  62. else if(size >= 1 && (formatted[size - 1] == '\n' || formatted[size - 1] == '\r'))
  63. {
  64. formatted.resize(size - 1);
  65. }
  66. /* 添加\0,QString以这个为结尾 */
  67. formatted.push_back('\0');
  68. /* 这个应该是处理兼容性的问题,C++17以前的兼容性问题
  69. * 这个可以提供对字符串的快速访问,不需要拷贝字符串 */
  70. const string_view_t str = string_view_t(formatted.data(), formatted.size());
  71. // qDebug() << "Aftter string_view_t formatted.size() = " << formatted.size();
  72. /* 根据等级输出 */
  73. if(msgLevel == level::trace) {
  74. /* 这个等级不输出,理论上也不会有这个等级的日志到这一步,在外面就拦截了 */
  75. }
  76. else if (msgLevel == level::debug) {
  77. m_lhLog->DoWriteLogEx(m_strLogName, ELT_Log_Debug, str.data());
  78. }
  79. else if (msgLevel == level::info) {
  80. m_lhLog->DoWriteLogEx(m_strLogName, ELT_Log_Common, str.data());
  81. }
  82. else if(msgLevel == level::warn) {
  83. m_lhLog->DoWriteLogEx(m_strLogName, ELT_Log_Error, str.data());
  84. }
  85. else if (msgLevel == level::err) {
  86. m_lhLog->DoWriteLogEx(m_strLogName, ELT_Log_Error, str.data());
  87. }
  88. else if(msgLevel == level::critical) {
  89. /* 因该不会用到这个等级,不输出 */
  90. }else if (msgLevel == level::off) {
  91. /* 不输出 */
  92. }
  93. // QString strLog = QString::fromLocal8Bit(str.data(), str.size());
  94. // qDebug() << strLog;
  95. }
  96. void flush_() override {}
  97. private:
  98. CLHQLogApi* m_lhLog = nullptr;
  99. QString m_strLogName;
  100. QString m_libName;
  101. };
  102. using LHLog_file_sink_mt = LHLog_file_sink<std::mutex>;
  103. using LHLog_file_sink_st = LHLog_file_sink<details::null_mutex>;
  104. } // namespace sinks
  105. } // namespace spdlog
  106. #endif /* LHLOG_FILE_SINK_H */