LHLogInit.cpp 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. #include "LHLogInit.h"
  2. #include "spdlog/spdlog.h"
  3. #include "spdlog/sinks/stdout_color_sinks.h"
  4. #include "LHLog_file_sink.h"
  5. #include <string>
  6. // #include <filesystem>
  7. #include <QCoreApplication>
  8. /* 初始化spdlog,输入的是模组名称,可以为空
  9. * lhQLog是一个全局函数,在库LHQLog中定义
  10. * 这里获取可执行文件文件夹的路径,使用的是C++17新引入的特性
  11. * GCC9会在标准库中,GCC8.3需要手动链接库stdc++fs才可以使用
  12. */
  13. std::atomic_bool g_isLogInit(false); // 是否已经初始化日志
  14. void initLog(QString ModuleName, CLHQLogApi& lhQLog)
  15. {
  16. if(g_isLogInit.load())
  17. {
  18. return;
  19. }
  20. try {
  21. /* 创建一个控制台sink */
  22. auto sink_consolse = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();
  23. /* 创建一个文件sink,每天一个,00:00创建新的 */
  24. // auto sink_file = std::make_shared<spdlog::sinks::daily_file_sink_mt>("FlowChartLog/log.txt",0,0);
  25. /* 自定义的sink */
  26. // std::filesystem::path execPath = std::filesystem::current_path();
  27. QString execPath = QCoreApplication::applicationDirPath();
  28. #if defined(Q_OS_WIN32)
  29. #if C_DEBUG
  30. QString libName = execPath + "/LHQLogd.dll";
  31. #elif C_RELEASE
  32. QString libName = execPath + "/LHQLog.dll";
  33. #endif
  34. #elif defined(Q_OS_LINUX)
  35. QString libName = execPath + "/libLHQLog.so";
  36. #endif
  37. /* 写入文件的sink */
  38. auto sink_custom = std::make_shared<spdlog::sinks::LHLog_file_sink_mt>(&lhQLog, libName, ModuleName);
  39. /* 给默认记录器用的sink */
  40. auto sink_default = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();
  41. /* 修改输出格式 */
  42. #if defined (C_DEBUG)
  43. sink_consolse->set_pattern("%^[%Y-%m-%d %H:%M:%S:%e] [%l] [%n] [%s %#] %v%$");
  44. // sink_file->set_pattern("[%Y-%m-%d %H:%M:%S] [%^%n%$] [%^%l%$] %s %#: %v");
  45. sink_custom->set_pattern("%v");
  46. sink_default->set_pattern("%^[%Y-%m-%d %H:%M:%S:%e] [%l] [%s %#] %v%$");
  47. #elif defined(C_RELEASE)
  48. sink_consolse->set_pattern("%^[%Y-%m-%d %H:%M:%S:%e] [%l] [%n] %v%$");
  49. // sink_file->set_pattern("[%Y-%m-%d %H:%M:%S] [%^%n%$] [%^%l%$] %s %#: %v");
  50. sink_custom->set_pattern("%v");
  51. sink_default->set_pattern("%^[%Y-%m-%d %H:%M:%S:%e] [%l] %v%$");
  52. #endif
  53. /* 日志输出方向,终端和文件 */
  54. std::vector<spdlog::sink_ptr> sinks;
  55. sinks.push_back(sink_consolse);
  56. // sinks.push_back(sink_file);
  57. sinks.push_back(sink_custom);
  58. /* 设置默认日志记录器,设置成自定义的sink */
  59. spdlog::default_logger()->sinks().clear();
  60. spdlog::default_logger()->sinks().push_back(sink_default);
  61. spdlog::default_logger()->sinks().push_back(sink_custom);
  62. // auto vecSinks = spdlog::default_logger()->sinks();
  63. // for(auto& sink : vecSinks)
  64. // {
  65. // SPDLOG_INFO("sink name = {}", typeid(*sink).name());
  66. // }
  67. /* 创建一个标准输出 */
  68. auto logger_main = std::make_shared<spdlog::logger>("main",begin(sinks),end(sinks));
  69. /* 创建一个 FromWebAPI logger */
  70. auto logger_webapi = std::make_shared<spdlog::logger>("FromWebAPI",begin(sinks),end(sinks));
  71. /* 创建一个ACAServer记录器 */
  72. auto logger_acaserver = std::make_shared<spdlog::logger>("ACAServer",begin(sinks),end(sinks));
  73. /* 创建一个录音线程记录器 */
  74. auto logger_record = std::make_shared<spdlog::logger>("RecordAudio",begin(sinks),end(sinks));
  75. /* 创建一个计算线程记录器 */
  76. auto logger_caculate = std::make_shared<spdlog::logger>("Calculate",begin(sinks),end(sinks));
  77. /* 创建一个RTP服务的logger */
  78. auto logger_rtpserver = std::make_shared<spdlog::logger>("RTPServer",begin(sinks),end(sinks));
  79. /* 创建一个对比项管理线程的logger */
  80. auto logger_compareitem = std::make_shared<spdlog::logger>("CompareItemManager",begin(sinks),end(sinks));
  81. /* 创建一个处理日志的线程logger */
  82. auto logger_threadAlarm = std::make_shared<spdlog::logger>("Alarm",begin(sinks),end(sinks));
  83. /* 注册到注册表 */
  84. spdlog::register_logger(logger_main);
  85. spdlog::register_logger(logger_webapi);
  86. spdlog::register_logger(logger_acaserver);
  87. spdlog::register_logger(logger_record);
  88. spdlog::register_logger(logger_rtpserver);
  89. spdlog::register_logger(logger_compareitem);
  90. spdlog::register_logger(logger_caculate);
  91. spdlog::register_logger(logger_threadAlarm);
  92. /* 设置spdlog输出级别,默认的估计不输出debug这个级别
  93. * 这是默认的设置,可以在外面单数设置输出方式
  94. * release模式下不输出console的日志输出
  95. * */
  96. #if defined (C_DEBUG)
  97. spdlog::set_level(spdlog::level::trace);
  98. spdlog::flush_on(spdlog::level::trace);
  99. #elif defined(C_RELEASE)
  100. spdlog::set_level(spdlog::level::info); /* 只输出info以上的输出 */
  101. spdlog::flush_on(spdlog::level::info); /* 设置刷新等级 */
  102. // sink_consolse->set_level(spdlog::level::off); /* 控制台不输出 */
  103. // sink_default->set_level(spdlog::level::off); /* 默认sink也不输出 */
  104. #endif
  105. // SPDLOG_LOGGER_DEBUG(logger_main,"******* 有行号且debug也能输出 *******");
  106. }
  107. catch (const spdlog::spdlog_ex& ex) {
  108. qDebug() << "Log initialization failed: " << ex.what() ;
  109. }
  110. g_isLogInit.store(true);
  111. }
  112. /* 修改日志输出等级,输入1表示 */
  113. void changeLogLevel(ELogLevel level)
  114. {
  115. if(ELogLevel::Log_Debug == level)
  116. {
  117. spdlog::set_level(spdlog::level::debug);
  118. spdlog::flush_on(spdlog::level::debug);
  119. }
  120. else if(ELogLevel::Log_Info == level)
  121. {
  122. spdlog::set_level(spdlog::level::info);
  123. spdlog::flush_on(spdlog::level::info);
  124. /* 获取写入文件的sink,release模式下不写入文件 */
  125. auto logger = spdlog::get("main");
  126. auto sinks = logger->sinks();
  127. sinks[1]->set_level(spdlog::level::info);
  128. }
  129. }