log_manager.h 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. // Copyright 2013 Dolphin Emulator Project
  2. // Licensed under GPLv2
  3. // Refer to the license.txt file included.
  4. #pragma once
  5. #include "common/log.h"
  6. #include "common/string_util.h"
  7. #include "common/thread.h"
  8. #include "common/file_util.h"
  9. #include <cstring>
  10. #include <set>
  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 char *filename);
  24. void Log(LogTypes::LOG_LEVELS, const char *msg);
  25. bool IsValid() { return !m_logfile.fail(); }
  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 DebuggerLogListener : public LogListener
  35. {
  36. public:
  37. void Log(LogTypes::LOG_LEVELS, const char *msg);
  38. };
  39. class LogContainer
  40. {
  41. public:
  42. LogContainer(const char* shortName, const char* fullName, bool enable = false);
  43. const char* GetShortName() const { return m_shortName; }
  44. const char* GetFullName() const { return m_fullName; }
  45. void AddListener(LogListener* listener);
  46. void RemoveListener(LogListener* listener);
  47. void Trigger(LogTypes::LOG_LEVELS, const char *msg);
  48. bool IsEnabled() const { return m_enable; }
  49. void SetEnable(bool enable) { m_enable = enable; }
  50. LogTypes::LOG_LEVELS GetLevel() const { return m_level; }
  51. void SetLevel(LogTypes::LOG_LEVELS level) { m_level = level; }
  52. bool HasListeners() const { return !m_listeners.empty(); }
  53. private:
  54. char m_fullName[128];
  55. char m_shortName[32];
  56. bool m_enable;
  57. LogTypes::LOG_LEVELS m_level;
  58. std::mutex m_listeners_lock;
  59. std::set<LogListener*> m_listeners;
  60. };
  61. class ConsoleListener;
  62. class LogManager : NonCopyable
  63. {
  64. private:
  65. LogContainer* m_Log[LogTypes::NUMBER_OF_LOGS];
  66. FileLogListener *m_fileLog;
  67. ConsoleListener *m_consoleLog;
  68. DebuggerLogListener *m_debuggerLog;
  69. static LogManager *m_logManager; // Singleton. Ugh.
  70. LogManager();
  71. ~LogManager();
  72. public:
  73. static u32 GetMaxLevel() { return LogTypes::MAX_LOGLEVEL; }
  74. void Log(LogTypes::LOG_LEVELS level, LogTypes::LOG_TYPE type, const char* file, int line,
  75. const char* function, const char *fmt, va_list args);
  76. void SetLogLevel(LogTypes::LOG_TYPE type, LogTypes::LOG_LEVELS level)
  77. {
  78. m_Log[type]->SetLevel(level);
  79. }
  80. void SetEnable(LogTypes::LOG_TYPE type, bool enable)
  81. {
  82. m_Log[type]->SetEnable(enable);
  83. }
  84. bool IsEnabled(LogTypes::LOG_TYPE type) const
  85. {
  86. return m_Log[type]->IsEnabled();
  87. }
  88. const char* GetShortName(LogTypes::LOG_TYPE type) const
  89. {
  90. return m_Log[type]->GetShortName();
  91. }
  92. const char* GetFullName(LogTypes::LOG_TYPE type) const
  93. {
  94. return m_Log[type]->GetFullName();
  95. }
  96. void AddListener(LogTypes::LOG_TYPE type, LogListener *listener)
  97. {
  98. m_Log[type]->AddListener(listener);
  99. }
  100. void RemoveListener(LogTypes::LOG_TYPE type, LogListener *listener)
  101. {
  102. m_Log[type]->RemoveListener(listener);
  103. }
  104. FileLogListener *GetFileListener() const
  105. {
  106. return m_fileLog;
  107. }
  108. ConsoleListener *GetConsoleListener() const
  109. {
  110. return m_consoleLog;
  111. }
  112. DebuggerLogListener *GetDebuggerListener() const
  113. {
  114. return m_debuggerLog;
  115. }
  116. static LogManager* GetInstance()
  117. {
  118. return m_logManager;
  119. }
  120. static void SetInstance(LogManager *logManager)
  121. {
  122. m_logManager = logManager;
  123. }
  124. static void Init();
  125. static void Shutdown();
  126. };