stream_log_manager.cpp 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. #include "stream_log_manager.h"
  2. #include <library/cpp/yt/logging/logger.h>
  3. #include <library/cpp/yt/logging/plain_text_formatter/formatter.h>
  4. #include <library/cpp/yt/string/raw_formatter.h>
  5. #include <library/cpp/yt/threading/fork_aware_spin_lock.h>
  6. namespace NYT::NLogging {
  7. ////////////////////////////////////////////////////////////////////////////////
  8. class TStreamLogManager
  9. : public ILogManager
  10. {
  11. public:
  12. explicit TStreamLogManager(IOutputStream* output)
  13. : Output_(output)
  14. { }
  15. void RegisterStaticAnchor(
  16. TLoggingAnchor* /*anchor*/,
  17. ::TSourceLocation /*sourceLocation*/,
  18. TStringBuf /*anchorMessage*/) override
  19. { }
  20. virtual void UpdateAnchor(TLoggingAnchor* /*anchor*/) override
  21. { }
  22. virtual void Enqueue(TLogEvent&& event) override
  23. {
  24. Buffer_.Reset();
  25. EventFormatter_.Format(&Buffer_, event);
  26. *Output_ << Buffer_.GetBuffer() << Endl;
  27. }
  28. virtual const TLoggingCategory* GetCategory(TStringBuf categoryName) override
  29. {
  30. if (!categoryName) {
  31. return nullptr;
  32. }
  33. auto guard = Guard(SpinLock_);
  34. auto it = NameToCategory_.find(categoryName);
  35. if (it == NameToCategory_.end()) {
  36. auto category = std::make_unique<TLoggingCategory>();
  37. category->Name = categoryName;
  38. category->ActualVersion = &Version_;
  39. category->CurrentVersion = Version_.load();
  40. it = NameToCategory_.emplace(categoryName, std::move(category)).first;
  41. }
  42. return it->second.get();
  43. }
  44. virtual void UpdateCategory(TLoggingCategory* /*category*/) override
  45. { }
  46. virtual bool GetAbortOnAlert() const override
  47. {
  48. return false;
  49. }
  50. private:
  51. IOutputStream* const Output_;
  52. NThreading::TForkAwareSpinLock SpinLock_;
  53. THashMap<TString, std::unique_ptr<TLoggingCategory>> NameToCategory_;
  54. std::atomic<int> Version_ = 1;
  55. TPlainTextEventFormatter EventFormatter_{/*enableSourceLocation*/ false};
  56. TRawFormatter<MessageBufferSize> Buffer_;
  57. };
  58. std::unique_ptr<ILogManager> CreateStreamLogManager(IOutputStream* output)
  59. {
  60. return std::make_unique<TStreamLogManager>(output);
  61. }
  62. ////////////////////////////////////////////////////////////////////////////////
  63. } // namespace NYT::NLogging