015-logger.cpp 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. // SPDX-License-Identifier: GPL-3.0-or-later
  2. // SPDX-FileCopyrightText: 2019-2025 Ivan Baidakou
  3. #include "test-utils.h"
  4. #include "utils/log.h"
  5. #include "utils/log-setup.h"
  6. #include <spdlog/sinks/dist_sink.h>
  7. #include <spdlog/sinks/null_sink.h>
  8. #include <spdlog/sinks/stdout_color_sinks.h>
  9. namespace st = syncspirit::test;
  10. namespace bfs = std::filesystem;
  11. using namespace syncspirit;
  12. using L = spdlog::level::level_enum;
  13. static bool _init = []() {
  14. auto dist_sink = utils::create_root_logger();
  15. auto console_sink = std::make_shared<spdlog::sinks::stderr_color_sink_mt>();
  16. dist_sink->add_sink(console_sink);
  17. dist_sink->add_sink(std::make_shared<spdlog::sinks::null_sink_mt>());
  18. return true;
  19. }();
  20. TEST_CASE("default logger", "[log]") {
  21. config::log_configs_t cfg{{"default", L::trace, {"stdout"}}};
  22. REQUIRE(utils::init_loggers(cfg));
  23. auto l = utils::get_logger("default");
  24. CHECK(l);
  25. CHECK(l->level() == L::trace);
  26. }
  27. TEST_CASE("hierarchy", "[log]") {
  28. config::log_configs_t cfg{{"default", L::trace, {"stdout"}}, {"a", L::info, {}}, {"a.b.c", L::warn, {}}};
  29. REQUIRE(utils::init_loggers(cfg));
  30. SECTION("custom") {
  31. auto l = utils::get_logger("a");
  32. REQUIRE(l);
  33. CHECK(l->level() == L::info);
  34. }
  35. SECTION("submatch") {
  36. auto l = utils::get_logger("a.b");
  37. REQUIRE(l);
  38. CHECK(l->level() == L::info);
  39. }
  40. SECTION("full match") {
  41. auto l = utils::get_logger("a.b.c");
  42. REQUIRE(l);
  43. CHECK(l->level() == L::warn);
  44. }
  45. SECTION("mismatch") {
  46. auto l = utils::get_logger("xxx");
  47. REQUIRE(l);
  48. CHECK(l->level() == L::trace);
  49. }
  50. }
  51. TEST_CASE("file sink", "[log]") {
  52. auto dir = bfs::absolute(bfs::current_path() / st::unique_path());
  53. auto path_guard = st::path_guard_t{dir};
  54. bfs::create_directory(dir);
  55. auto log_file = dir / "log.txt";
  56. auto log_file_str = log_file.string();
  57. auto sink_config = fmt::format("file:{}", log_file_str);
  58. config::log_configs_t cfg{{"default", L::trace, {sink_config}}};
  59. REQUIRE(utils::init_loggers(cfg));
  60. auto l = utils::get_logger("default");
  61. l->info("lorem ipsum dolor");
  62. l->flush();
  63. spdlog::drop_all(); // to cleanup on win32
  64. auto data = st::read_file(log_file);
  65. CHECK(log_file_str != "");
  66. CHECK(!data.empty());
  67. CHECK(data.find("lorem ipsum dolor") != std::string::npos);
  68. }