Log.h 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. // Copyright (c) 2008-2023 the Urho3D project
  2. // License: MIT
  3. #pragma once
  4. #include "../Container/List.h"
  5. #include "../Core/Mutex.h"
  6. #include "../Core/Object.h"
  7. #include "../Core/StringUtils.h"
  8. namespace Urho3D
  9. {
  10. /// Fictional message level to indicate a stored raw message.
  11. static const int LOG_RAW = -1;
  12. /// Trace message level.
  13. static const int LOG_TRACE = 0;
  14. /// Debug message level. By default only shown in debug mode.
  15. static const int LOG_DEBUG = 1;
  16. /// Informative message level.
  17. static const int LOG_INFO = 2;
  18. /// Warning message level.
  19. static const int LOG_WARNING = 3;
  20. /// Error message level.
  21. static const int LOG_ERROR = 4;
  22. /// Disable all log messages.
  23. static const int LOG_NONE = 5;
  24. class File;
  25. /// Stored log message from another thread.
  26. struct StoredLogMessage
  27. {
  28. /// Construct undefined.
  29. StoredLogMessage() = default;
  30. /// Construct with parameters.
  31. StoredLogMessage(const String& message, int level, bool error) :
  32. message_(message),
  33. level_(level),
  34. error_(error)
  35. {
  36. }
  37. /// Message text.
  38. String message_;
  39. /// Message level. -1 for raw messages.
  40. int level_{};
  41. /// Error flag for raw messages.
  42. bool error_{};
  43. };
  44. /// Logging subsystem.
  45. class URHO3D_API Log : public Object
  46. {
  47. URHO3D_OBJECT(Log, Object);
  48. public:
  49. /// Construct.
  50. explicit Log(Context* context);
  51. /// Destruct. Close the log file if open.
  52. ~Log() override;
  53. /// Open the log file.
  54. void Open(const String& fileName);
  55. /// Close the log file.
  56. void Close();
  57. /// Set logging level.
  58. /// @property
  59. void SetLevel(int level);
  60. /// Set whether to timestamp log messages.
  61. /// @property
  62. void SetTimeStamp(bool enable);
  63. /// Set quiet mode ie. only print error entries to standard error stream (which is normally redirected to console also). Output to log file is not affected by this mode.
  64. /// @property
  65. void SetQuiet(bool quiet);
  66. /// Return logging level.
  67. /// @property
  68. int GetLevel() const { return level_; }
  69. /// Return whether log messages are timestamped.
  70. /// @property
  71. bool GetTimeStamp() const { return timeStamp_; }
  72. /// Return last log message.
  73. /// @property
  74. String GetLastMessage() const { return lastMessage_; }
  75. /// Return whether log is in quiet mode (only errors printed to standard error stream).
  76. /// @property
  77. bool IsQuiet() const { return quiet_; }
  78. /// Write to the log. If logging level is higher than the level of the message, the message is ignored.
  79. /// @nobind
  80. static void Write(int level, const String& message);
  81. /// Write formatted message to the log. If logging level is higher than the level of the message, the message is ignored.
  82. static void WriteFormat(int level, const char* format, ...);
  83. /// Write raw output to the log.
  84. static void WriteRaw(const String& message, bool error = false);
  85. private:
  86. /// Handle end of frame. Process the threaded log messages.
  87. void HandleEndFrame(StringHash eventType, VariantMap& eventData);
  88. /// Mutex for threaded operation.
  89. Mutex logMutex_;
  90. /// Log messages from other threads.
  91. List<StoredLogMessage> threadMessages_;
  92. /// Log file.
  93. SharedPtr<File> logFile_;
  94. /// Last log message.
  95. String lastMessage_;
  96. /// Logging level.
  97. int level_;
  98. /// Timestamp log messages flag.
  99. bool timeStamp_;
  100. /// In write flag to prevent recursion.
  101. bool inWrite_;
  102. /// Quiet mode flag.
  103. bool quiet_;
  104. };
  105. #ifdef URHO3D_LOGGING
  106. #define URHO3D_LOG(level, message) Urho3D::Log::Write(level, message)
  107. #define URHO3D_LOGTRACE(message) Urho3D::Log::Write(Urho3D::LOG_TRACE, message)
  108. #define URHO3D_LOGDEBUG(message) Urho3D::Log::Write(Urho3D::LOG_DEBUG, message)
  109. #define URHO3D_LOGINFO(message) Urho3D::Log::Write(Urho3D::LOG_INFO, message)
  110. #define URHO3D_LOGWARNING(message) Urho3D::Log::Write(Urho3D::LOG_WARNING, message)
  111. #define URHO3D_LOGERROR(message) Urho3D::Log::Write(Urho3D::LOG_ERROR, message)
  112. #define URHO3D_LOGRAW(message) Urho3D::Log::Write(Urho3D::LOG_RAW, message)
  113. #define URHO3D_LOGF(level, format, ...) Urho3D::Log::WriteFormat(level, format, ##__VA_ARGS__)
  114. #define URHO3D_LOGTRACEF(format, ...) Urho3D::Log::WriteFormat(Urho3D::LOG_TRACE, format, ##__VA_ARGS__)
  115. #define URHO3D_LOGDEBUGF(format, ...) Urho3D::Log::WriteFormat(Urho3D::LOG_DEBUG, format, ##__VA_ARGS__)
  116. #define URHO3D_LOGINFOF(format, ...) Urho3D::Log::WriteFormat(Urho3D::LOG_INFO, format, ##__VA_ARGS__)
  117. #define URHO3D_LOGWARNINGF(format, ...) Urho3D::Log::WriteFormat(Urho3D::LOG_WARNING, format, ##__VA_ARGS__)
  118. #define URHO3D_LOGERRORF(format, ...) Urho3D::Log::WriteFormat(Urho3D::LOG_ERROR, format, ##__VA_ARGS__)
  119. #define URHO3D_LOGRAWF(format, ...) Urho3D::Log::WriteFormat(Urho3D::LOG_RAW, format, ##__VA_ARGS__)
  120. #else
  121. #define URHO3D_LOG(message) ((void)0)
  122. #define URHO3D_LOGTRACE(message) ((void)0)
  123. #define URHO3D_LOGDEBUG(message) ((void)0)
  124. #define URHO3D_LOGINFO(message) ((void)0)
  125. #define URHO3D_LOGWARNING(message) ((void)0)
  126. #define URHO3D_LOGERROR(message) ((void)0)
  127. #define URHO3D_LOGRAW(message) ((void)0)
  128. #define URHO3D_LOGF(...) ((void)0)
  129. #define URHO3D_LOGTRACEF(...) ((void)0)
  130. #define URHO3D_LOGDEBUGF(...) ((void)0)
  131. #define URHO3D_LOGINFOF(...) ((void)0)
  132. #define URHO3D_LOGWARNINGF(...) ((void)0)
  133. #define URHO3D_LOGERRORF(...) ((void)0)
  134. #define URHO3D_LOGRAWF(...) ((void)0)
  135. #endif
  136. }