LogManager.h 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. // Copyright 2009 Dolphin Emulator Project
  2. // Licensed under GPLv2+
  3. // Refer to the license.txt file included.
  4. #pragma once
  5. #include <cstdarg>
  6. #include <fstream>
  7. #include <mutex>
  8. #include <set>
  9. #include <string>
  10. #include "Common/Common.h"
  11. #define MAX_MESSAGES 8000
  12. #define MAX_MSGLEN 1024
  13. // pure virtual interface
  14. class LogListener
  15. {
  16. public:
  17. virtual ~LogListener() {}
  18. virtual void Log(LogTypes::LOG_LEVELS, const char *msg) = 0;
  19. };
  20. class FileLogListener : public LogListener
  21. {
  22. public:
  23. FileLogListener(const std::string& filename);
  24. void Log(LogTypes::LOG_LEVELS, const char *msg) override;
  25. bool IsValid() const { return m_logfile.good(); }
  26. bool IsEnabled() const { return m_enable; }
  27. void SetEnable(bool enable) { m_enable = enable; }
  28. const char* GetName() const { return "file"; }
  29. private:
  30. std::mutex m_log_lock;
  31. std::ofstream m_logfile;
  32. bool m_enable;
  33. };
  34. class LogContainer
  35. {
  36. public:
  37. LogContainer(const std::string& shortName, const std::string& fullName, bool enable = false);
  38. std::string GetShortName() const { return m_shortName; }
  39. std::string GetFullName() const { return m_fullName; }
  40. void AddListener(LogListener* listener);
  41. void RemoveListener(LogListener* listener);
  42. void Trigger(LogTypes::LOG_LEVELS, const char *msg);
  43. bool IsEnabled() const { return m_enable; }
  44. void SetEnable(bool enable) { m_enable = enable; }
  45. LogTypes::LOG_LEVELS GetLevel() const { return m_level; }
  46. void SetLevel(LogTypes::LOG_LEVELS level) { m_level = level; }
  47. bool HasListeners() const { return !m_listeners.empty(); }
  48. private:
  49. std::string m_fullName;
  50. std::string m_shortName;
  51. bool m_enable;
  52. LogTypes::LOG_LEVELS m_level;
  53. std::mutex m_listeners_lock;
  54. std::set<LogListener*> m_listeners;
  55. };
  56. class ConsoleListener;
  57. class LogManager : NonCopyable
  58. {
  59. private:
  60. LogContainer* m_Log[LogTypes::NUMBER_OF_LOGS];
  61. FileLogListener *m_fileLog;
  62. ConsoleListener *m_consoleLog;
  63. static LogManager *m_logManager; // Singleton. Ugh.
  64. LogManager();
  65. ~LogManager();
  66. public:
  67. static u32 GetMaxLevel() { return MAX_LOGLEVEL; }
  68. void Log(LogTypes::LOG_LEVELS level, LogTypes::LOG_TYPE type,
  69. const char *file, int line, const char *fmt, va_list args);
  70. void SetLogLevel(LogTypes::LOG_TYPE type, LogTypes::LOG_LEVELS level)
  71. {
  72. m_Log[type]->SetLevel(level);
  73. }
  74. void SetEnable(LogTypes::LOG_TYPE type, bool enable)
  75. {
  76. m_Log[type]->SetEnable(enable);
  77. }
  78. bool IsEnabled(LogTypes::LOG_TYPE type, LogTypes::LOG_LEVELS level = LogTypes::LNOTICE) const
  79. {
  80. return m_Log[type]->IsEnabled() && m_Log[type]->GetLevel() >= level;
  81. }
  82. std::string GetShortName(LogTypes::LOG_TYPE type) const
  83. {
  84. return m_Log[type]->GetShortName();
  85. }
  86. std::string GetFullName(LogTypes::LOG_TYPE type) const
  87. {
  88. return m_Log[type]->GetFullName();
  89. }
  90. void AddListener(LogTypes::LOG_TYPE type, LogListener *listener)
  91. {
  92. m_Log[type]->AddListener(listener);
  93. }
  94. void RemoveListener(LogTypes::LOG_TYPE type, LogListener *listener)
  95. {
  96. m_Log[type]->RemoveListener(listener);
  97. }
  98. FileLogListener *GetFileListener() const
  99. {
  100. return m_fileLog;
  101. }
  102. ConsoleListener *GetConsoleListener() const
  103. {
  104. return m_consoleLog;
  105. }
  106. static LogManager* GetInstance()
  107. {
  108. return m_logManager;
  109. }
  110. static void SetInstance(LogManager *logManager)
  111. {
  112. m_logManager = logManager;
  113. }
  114. static void Init();
  115. static void Shutdown();
  116. };