1
0

tool_log.h 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. #ifndef AFUN_TOOL_LOG_H
  2. #define AFUN_TOOL_LOG_H
  3. #ifdef __cplusplus
  4. #include <iostream>
  5. #include "aFunToolExport.h"
  6. #include "tool_macro.h"
  7. #include "tool.h"
  8. #include <thread>
  9. #include <mutex>
  10. #include <condition_variable>
  11. #ifndef AFUN_TOOL_C
  12. namespace aFuntool {
  13. #endif
  14. #ifdef _MSC_VER
  15. typedef int pid_t;
  16. #endif
  17. enum LogLevel {
  18. log_track = 0,
  19. log_debug = 1,
  20. log_info = 2,
  21. log_warning = 3,
  22. log_error = 4,
  23. log_send_error = 5,
  24. log_fatal_error = 6,
  25. };
  26. typedef enum LogLevel LogLevel;
  27. class AFUN_TOOL_EXPORT LogFactory;
  28. class AFUN_TOOL_EXPORT Logger {
  29. friend class LogFactory;
  30. public:
  31. AFUN_INLINE explicit Logger(LogFactory &factor, std::string id, LogLevel level = log_warning, bool exit = true) noexcept;
  32. int writeTrackLog(const char *file, int line, const char *func, const char *format, ...);
  33. int writeDebugLog(const char *file, int line, const char *func, const char *format, ...);
  34. int writeInfoLog(const char *file, int line, const char *func, const char *format, ...);
  35. int writeWarningLog(const char *file, int line, const char *func, const char *format, ...);
  36. int writeErrorLog(const char *file, int line, const char *func, const char *format, ...);
  37. int writeSendErrorLog(const char *file, int line, const char *func, const char *format, ...) noexcept(false);
  38. int writeFatalErrorLog(const char *file, int line, const char *func, int exit_code, const char *format, ...) noexcept(false);
  39. private:
  40. LogFactory &factor_;
  41. const std::string id_;
  42. LogLevel level_ = log_debug;
  43. bool exit_ = true;
  44. };
  45. class AFUN_TOOL_EXPORT LogFactory {
  46. public:
  47. Logger sys_log = Logger(*this, "SYSTEM");
  48. LogFactory(const FilePath &path, bool is_async) noexcept(false);
  49. ~LogFactory();
  50. LogFactory(const LogFactory &)=delete;
  51. LogFactory &operator=(const LogFactory &)=delete;
  52. void writeLog(LogLevel level,
  53. const char *id, pid_t tid,
  54. const char *ti, time_t t,
  55. const char *file, int line, const char *func,
  56. const char *info);
  57. AFUN_STATIC void writeConsole(LogLevel level,
  58. const char *id, pid_t tid,
  59. const char *ti, time_t t,
  60. const char *file, int line,
  61. const char *info);
  62. void writeLogAsyn(LogLevel level,
  63. const char *id, pid_t tid,
  64. const char *ti, time_t t,
  65. const char *file, int line, const char *func, const char *info);
  66. int newLog(Logger *logger,
  67. bool pc,
  68. LogLevel level,
  69. const char *file, int line, const char *func,
  70. const char *format, va_list ap);
  71. struct LogNode *pop();
  72. struct ansyData;
  73. void ansyWritrLog(ansyData *data);
  74. private:
  75. bool init_; // 是否已经初始化
  76. pid_t pid_;
  77. FILE *log_; // 记录文件输出的位置
  78. FILE *csv_;
  79. bool async_; // 异步
  80. std::thread thread_;
  81. std::condition_variable cond_; // 有日志
  82. std::mutex mutex_;
  83. struct LogNode *log_buf_;
  84. struct LogNode **plog_buf_; // 指向 log_buf的末端
  85. };
  86. struct LogFactory::ansyData {
  87. LogFactory &factor;
  88. std::mutex &mutex;
  89. };
  90. #ifndef AFUN_TOOL_C
  91. }
  92. #endif
  93. #include "tool_log.inline.h"
  94. #ifndef NO_DEFINE_LOG_MACRO
  95. #include "tool_log_macro.h"
  96. #if aFunWriteTrack
  97. #define trackLog(logger, ...) ((logger) ? (logger)->writeTrackLog(__FILENAME__ , (int)__LINE__, __FUNCTION__, __VA_ARGS__) : 0)
  98. #else
  99. #define trackLog(logger, ...) (nullptr)
  100. #endif
  101. #if aFunWriteDebug
  102. #define debugLog(logger, ...) ((logger) ? (logger)->writeDebugLog(__FILENAME__ , (int)__LINE__, __FUNCTION__, __VA_ARGS__) : 0)
  103. #define assertDebugLog(c, logger, ...) ((c) || debugLog(logger, "Assert " #c " error : " __VA_ARGS__))
  104. #else
  105. #define debugLog(logger, ...) (nullptr)
  106. #define assertDebugLog(c, logger, ...) (c)
  107. #endif
  108. #if aFunWriteInfo
  109. #define infoLog(logger, ...) ((logger) ? (logger)->writeInfoLog(__FILENAME__ , (int)__LINE__, __FUNCTION__, __VA_ARGS__) : 0)
  110. #define assertInfoLog(c, logger, ...) ((c) || infoLog(logger, "Assert " #c " error : " __VA_ARGS__))
  111. #else
  112. #define infoLog(logger, ...) (nullptr)
  113. #define assertInfoLog(c, logger, ...) (c)
  114. #endif
  115. #if !aFunIgnoreWarning
  116. #define warningLog(logger, ...) ((logger) ? (logger)->writeWarningLog(__FILENAME__ , (int)__LINE__, __FUNCTION__, __VA_ARGS__) : 0)
  117. #define assertWarningLog(c, logger, ...) ((c) || warningLog(logger, "Assert " #c " error : " __VA_ARGS__))
  118. #else
  119. #define warningLog(logger, ...) (nullptr)
  120. #define assertWarningLog(c, logger, ...) (c)
  121. #endif
  122. #if !aFunIgnoreError
  123. #define errorLog(logger, ...) ((logger) ? (logger)->writeErrorLog(__FILENAME__ , (int)__LINE__, __FUNCTION__, __VA_ARGS__) : 0)
  124. #define assertErrorLog(c, logger, ...) ((c) || errorLog(logger, "Assert " #c " error : " __VA_ARGS__))
  125. #else
  126. #define errorLog(logger, ...) (nullptr)
  127. #define assertErrorLog(c, logger, ...) (c)
  128. #endif
  129. #if !aFunOFFAllLog
  130. #define sendErrorLog(logger, ...) ((logger) ? (logger)->writeSendErrorLog(__FILENAME__ , (int)__LINE__, __FUNCTION__, __VA_ARGS__) : 0)
  131. #define fatalErrorLog(logger, exit_code, ...) ((logger) ? (logger)->writeFatalErrorLog(__FILENAME__ , (int)__LINE__, __FUNCTION__, exit_code, __VA_ARGS__) : 0)
  132. #define assertSendErrorLog(c, logger, ...) ((c) || sendErrorLog(logger, "Assert " #c " error : " __VA_ARGS__))
  133. #define assertFatalErrorLog(c, logger, exit_code, ...) ((c) || fatalErrorLog(logger, exit_code, "Assert " #c " error : " __VA_ARGS__))
  134. #else
  135. #define sendErrorLog(logger, ...) (nullptr)
  136. #define fatalErrorLog(logger, exit_code, ...) (nullptr)
  137. #define assertSendErrorLog(c, logger, ...) (c)
  138. #define assertFatalErrorLog(c, logger, exit_code, ...) (c)
  139. #endif
  140. #endif
  141. #endif // __cplusplus
  142. #endif //AFUN_TOOL_LOG_H