logger.hpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. //
  2. // Logger.hpp
  3. // DanmakuRPG
  4. //
  5. // Created by Sam Jaffe on 7/18/15.
  6. // Copyright (c) 2015 Sam Jaffe. All rights reserved.
  7. //
  8. #pragma once
  9. #include <cstdarg>
  10. #include <cstdlib>
  11. #include <cstring>
  12. #include <string>
  13. #include <memory>
  14. #define VA_LOGN(level, size) \
  15. do { \
  16. va_list vargs; \
  17. va_start( vargs, fmt ); \
  18. vlognf( level, size, fmt, vargs ); \
  19. va_end( vargs ); \
  20. } while(0)
  21. #define VA_LOG(level) VA_LOGN(level, logger::LOGF_MAX_SIZE)
  22. namespace logging {
  23. class logger_impl;
  24. typedef logger_impl& (*_binding)(void);
  25. bool bind_logger_impl(_binding impl);
  26. enum log_level {
  27. LTRACE,
  28. LDEBUG,
  29. LINFO,
  30. LWARNING,
  31. LERROR,
  32. LCRITICAL,
  33. LFATAL,
  34. LNONE
  35. };
  36. const char* level_header(log_level);
  37. std::string timestamp();
  38. // struct logpacket {
  39. // struct tm time;
  40. // long milliseconds;
  41. // int thread_id;
  42. // log_level level;
  43. // const char* logger;
  44. // std::string message;
  45. // };
  46. class logger {
  47. public:
  48. static const size_t LOGF_MAX_SIZE = 2048;
  49. static logger& instance();
  50. static logger& instance(const char* key);
  51. public:
  52. inline void tracef(char const* fmt, ...) { VA_LOG(LTRACE); }
  53. inline void tracenf(size_t n, char const* fmt, ...) { VA_LOGN(LTRACE, n); }
  54. inline void trace(char const* msg) { log(LTRACE, msg); }
  55. inline void trace(std::string const& msg) { log(LTRACE, msg); }
  56. inline void debugf(char const* fmt, ...) { VA_LOG(LDEBUG); }
  57. inline void debugnf(size_t n, char const* fmt, ...) { VA_LOGN(LDEBUG, n); }
  58. inline void debug(char const* msg) { log(LDEBUG, msg); }
  59. inline void debug(std::string const& msg) { log(LDEBUG, msg); }
  60. inline void infof(char const* fmt, ...) { VA_LOG(LINFO); }
  61. inline void infonf(size_t n, char const* fmt, ...) { VA_LOGN(LINFO, n); }
  62. inline void info(char const* msg) { log(LINFO, msg); }
  63. inline void info(std::string const& msg) { log(LINFO, msg); }
  64. inline void warnf(char const* fmt, ...) { VA_LOG(LWARNING); }
  65. inline void warnnf(size_t n, char const* fmt, ...) { VA_LOGN(LWARNING, n); }
  66. inline void warn(char const* msg) { log(LWARNING, msg); }
  67. inline void warn(std::string const& msg) { log(LWARNING, msg); }
  68. inline void errorf(char const* fmt, ...) { VA_LOG(LERROR); }
  69. inline void errornf(size_t n, char const* fmt, ...) { VA_LOGN(LERROR, n); }
  70. inline void error(char const* msg) { log(LERROR, msg); }
  71. inline void error(std::string const& msg) { log(LERROR, msg); }
  72. inline void criticalf(char const* fmt, ...) { VA_LOG(LCRITICAL); }
  73. inline void criticalnf(size_t n, char const* fmt, ...) { VA_LOGN(LCRITICAL, n); }
  74. inline void critical(char const* msg) { log(LCRITICAL, msg); }
  75. inline void critical(std::string const& msg) { log(LCRITICAL, msg); }
  76. inline void fatalf(char const* fmt, ...) { VA_LOG(LFATAL); }
  77. inline void fatalnf(size_t n, char const* fmt, ...) { VA_LOGN(LFATAL, n); }
  78. inline void fatal(char const* msg) { log(LFATAL, msg); }
  79. inline void fatal(std::string const& msg) { log(LFATAL, msg); }
  80. void flush();
  81. ~logger();
  82. private:
  83. void vlognf(log_level, size_t, char const*, va_list);
  84. void log(log_level, std::string const&);
  85. std::string get_header(log_level level);
  86. logger(const char* name = "");
  87. logger(logger const&);
  88. logger& operator=(logger const&);
  89. log_level min_level_;
  90. const char* logger_name_;
  91. logger_impl& impl_;
  92. };
  93. class logger_impl {
  94. public:
  95. virtual void write(log_level level, std::string const& msg) = 0;
  96. virtual void flush() = 0;
  97. virtual ~logger_impl() = default;
  98. };
  99. }
  100. #undef VA_LOG
  101. #undef LA_LOGN