log.h 5.9 KB

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