yt_log.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. #include "yt_log.h"
  2. #include "logger.h"
  3. #include <util/generic/guid.h>
  4. #include <util/system/mutex.h>
  5. namespace NYT {
  6. using namespace NLogging;
  7. ////////////////////////////////////////////////////////////////////////////////
  8. namespace {
  9. class TLogManager
  10. : public ILogManager
  11. {
  12. public:
  13. static constexpr TStringBuf CategoryName = "Wrapper";
  14. public:
  15. void RegisterStaticAnchor(
  16. TLoggingAnchor* anchor,
  17. ::TSourceLocation sourceLocation,
  18. TStringBuf anchorMessage) override
  19. {
  20. if (auto* defaultLogManager = GetDefaultLogManager()) {
  21. defaultLogManager->RegisterStaticAnchor(anchor, sourceLocation, anchorMessage);
  22. }
  23. auto guard = Guard(Mutex_);
  24. anchor->SourceLocation = sourceLocation;
  25. anchor->AnchorMessage = anchorMessage;
  26. }
  27. void UpdateAnchor(TLoggingAnchor* anchor) override
  28. {
  29. if (auto* defaultLogManager = GetDefaultLogManager()) {
  30. defaultLogManager->UpdateAnchor(anchor);
  31. }
  32. }
  33. void Enqueue(TLogEvent&& event) override
  34. {
  35. if (auto logger = GetLogger()) {
  36. LogMessage(
  37. logger,
  38. ToImplLevel(event.Level),
  39. ::TSourceLocation(event.SourceFile, event.SourceLine),
  40. "%.*s",
  41. event.MessageRef.size(),
  42. event.MessageRef.begin());
  43. } else if (auto* defaultLogManager = GetDefaultLogManager()) {
  44. defaultLogManager->Enqueue(std::move(event));
  45. }
  46. }
  47. const TLoggingCategory* GetCategory(TStringBuf categoryName) override
  48. {
  49. Y_ABORT_UNLESS(categoryName == CategoryName);
  50. return &Category_;
  51. }
  52. void UpdateCategory(TLoggingCategory* /*category*/) override
  53. {
  54. Y_ABORT();
  55. }
  56. bool GetAbortOnAlert() const override
  57. {
  58. return false;
  59. }
  60. private:
  61. static ILogger::ELevel ToImplLevel(ELogLevel level)
  62. {
  63. switch (level) {
  64. case ELogLevel::Minimum:
  65. case ELogLevel::Trace:
  66. case ELogLevel::Debug:
  67. return ILogger::ELevel::DEBUG;
  68. case ELogLevel::Info:
  69. return ILogger::ELevel::INFO;
  70. case ELogLevel::Warning:
  71. case ELogLevel::Error:
  72. return ILogger::ELevel::ERROR;
  73. case ELogLevel::Alert:
  74. case ELogLevel::Fatal:
  75. case ELogLevel::Maximum:
  76. return ILogger::ELevel::FATAL;
  77. }
  78. }
  79. static void LogMessage(const ILoggerPtr& /* logger */, ILogger::ELevel level, const ::TSourceLocation& sourceLocation, const char* format, ...)
  80. {
  81. va_list args;
  82. va_start(args, format);
  83. GetLogger()->Log(level, sourceLocation, format, args);
  84. va_end(args);
  85. }
  86. private:
  87. ::TMutex Mutex_;
  88. std::atomic<int> ActualVersion_{1};
  89. const TLoggingCategory Category_{
  90. .Name{CategoryName},
  91. .MinPlainTextLevel{ELogLevel::Minimum},
  92. .CurrentVersion{1},
  93. .ActualVersion = &ActualVersion_,
  94. };
  95. };
  96. TLogManager LogManager;
  97. } // namespace
  98. ////////////////////////////////////////////////////////////////////////////////
  99. TLogger Logger(&LogManager, TLogManager::CategoryName);
  100. ////////////////////////////////////////////////////////////////////////////////
  101. void FormatValue(TStringBuilderBase* builder, const TGUID& value, TStringBuf /*format*/)
  102. {
  103. builder->AppendString(GetGuidAsString(value));
  104. }
  105. ////////////////////////////////////////////////////////////////////////////////
  106. } // namespace NYT