LHLogInit.cpp 4.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  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 <QApplication>
  7. /* 初始化spdlog,输入的是模组名称,可以为空
  8. * lhQLog是一个全局函数,在库LHQLog中定义
  9. * 这里获取可执行文件文件夹的路径,使用的是C++17新引入的特性
  10. * GCC9会在标准库中,GCC8.3需要手动链接库stdc++fs才可以使用
  11. */
  12. void initLog(QString ModuleName, CLHQLogApi& lhQLog)
  13. {
  14. try
  15. {
  16. /* 创建一个文件sink,每天一个,00:00创建新的 */
  17. // auto sink_file = std::make_shared<spdlog::sinks::daily_file_sink_mt>("FlowChartLog/log.txt",0,0);
  18. /* 自定义的sink */
  19. // std::filesystem::path execPath = std::filesystem::current_path();
  20. std::string execPath = QApplication::applicationDirPath().toStdString();
  21. #if defined(Q_OS_WIN32)
  22. #if C_DEBUG
  23. std::string libName = execPath + "/LHQLogd.dll";
  24. #elif C_RELEASE
  25. std::string libName = execPath + "/LHQLog.dll";
  26. #endif
  27. #elif defined(Q_OS_LINUX)
  28. std::string libName = execPath + "/libLHQLog.so";
  29. #endif
  30. /* 给默认记录器用的sink */
  31. auto sink_default = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();
  32. /* 创建一个控制台sink */
  33. auto sink_consolse = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();
  34. /* 创建写入文件的sink */
  35. auto sink_LHLog = std::make_shared<spdlog::sinks::LHLog_file_sink_mt>(&lhQLog, QString(libName.c_str()), ModuleName);
  36. /* 修改输出格式 */
  37. #if C_DEBUG
  38. sink_consolse->set_pattern("%^[%Y-%m-%d %H:%M:%S:%e] [%l] [%n] [%s %#] %v %$");
  39. // sink_file->set_pattern("[%Y-%m-%d %H:%M:%S:%e] [%^%n%$] [%^%l%$] %s %#: %v");
  40. sink_LHLog->set_pattern("%v");
  41. sink_default->set_pattern("%^[%Y-%m-%d %H:%M:%S:%e:%e] [%l] [%s %#] %v %$");
  42. #elif C_RELEASE
  43. sink_consolse->set_pattern("%^[%Y-%m-%d %H:%M:%S:%e] [%l] [%n] %v %$");
  44. // sink_file->set_pattern("%^[%Y-%m-%d %H:%M:%S:%e] [%l] [%n]: %v %$");
  45. sink_LHLog->set_pattern("%v");
  46. sink_default->set_pattern("%^[%Y-%m-%d %H:%M:%S:%e] [%l] %v %$");
  47. #endif
  48. /* 日志输出方向,终端和文件 */
  49. std::vector<spdlog::sink_ptr> sinks;
  50. sinks.push_back(sink_consolse);
  51. // sinks.push_back(sink_file);
  52. sinks.push_back(sink_LHLog);
  53. /* 设置默认日志记录器,设置成自定义的sink */
  54. spdlog::default_logger()->sinks().clear();
  55. spdlog::default_logger()->sinks().push_back(sink_default);
  56. spdlog::default_logger()->sinks().push_back(sink_LHLog);
  57. /* 创建一个标准输出 */
  58. auto logger_main = std::make_shared<spdlog::logger>("main",begin(sinks),end(sinks));
  59. /* 创建一个WebAPI logger */
  60. auto logger_WebAPI = std::make_shared<spdlog::logger>("WebAPI",begin(sinks),end(sinks));
  61. /* 注册到注册表 */
  62. spdlog::register_logger(logger_main);
  63. spdlog::register_logger(logger_WebAPI);
  64. /* 设置spdlog输出级别,默认的估计不输出debug这个级别
  65. * 这是默认的设置,可以在外面单数设置输出方式
  66. * release模式下不输出console的日志输出
  67. * */
  68. #if defined (C_DEBUG)
  69. spdlog::set_level(spdlog::level::trace);
  70. spdlog::flush_on(spdlog::level::trace);
  71. #elif defined(C_RELEASE)
  72. spdlog::set_level(spdlog::level::info); /* 只输出info以上的输出 */
  73. spdlog::flush_on(spdlog::level::info); /* 设置刷新等级 */
  74. sink_consolse->set_level(spdlog::level::info); /* 控制台不输出 */
  75. sink_default->set_level(spdlog::level::info); /* 默认sink也不输出 */
  76. #endif
  77. // SPDLOG_LOGGER_DEBUG(logger_main,"******* 有行号且debug也能输出 *******");
  78. }
  79. catch (const spdlog::spdlog_ex& ex) {
  80. qDebug() << "Log initialization failed: " << ex.what() ;
  81. }
  82. }