c_logger.h 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. //
  2. // c_logger.hpp
  3. // logging
  4. //
  5. // Created by Sam Jaffe on 4/1/19.
  6. //
  7. #pragma once
  8. #include <cstdarg>
  9. #include <cstdlib>
  10. #include <cstring>
  11. #include <memory>
  12. #include <string>
  13. #include "logger_fwd.h"
  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, c_logger::LOGF_MAX_SIZE)
  22. namespace logging {
  23. class logger_impl;
  24. std::string timestamp();
  25. class c_logger {
  26. public:
  27. static const size_t LOGF_MAX_SIZE = 2048;
  28. public:
  29. inline void tracef(char const* fmt, ...) { VA_LOG(LTRACE); }
  30. inline void tracenf(size_t n, char const* fmt, ...) { VA_LOGN(LTRACE, n); }
  31. inline void trace(char const* msg) { log(LTRACE, msg); }
  32. inline void trace(std::string const& msg) { log(LTRACE, msg); }
  33. inline void debugf(char const* fmt, ...) { VA_LOG(LDEBUG); }
  34. inline void debugnf(size_t n, char const* fmt, ...) { VA_LOGN(LDEBUG, n); }
  35. inline void debug(char const* msg) { log(LDEBUG, msg); }
  36. inline void debug(std::string const& msg) { log(LDEBUG, msg); }
  37. inline void infof(char const* fmt, ...) { VA_LOG(LINFO); }
  38. inline void infonf(size_t n, char const* fmt, ...) { VA_LOGN(LINFO, n); }
  39. inline void info(char const* msg) { log(LINFO, msg); }
  40. inline void info(std::string const& msg) { log(LINFO, msg); }
  41. inline void warnf(char const* fmt, ...) { VA_LOG(LWARNING); }
  42. inline void warnnf(size_t n, char const* fmt, ...) { VA_LOGN(LWARNING, n); }
  43. inline void warn(char const* msg) { log(LWARNING, msg); }
  44. inline void warn(std::string const& msg) { log(LWARNING, msg); }
  45. inline void errorf(char const* fmt, ...) { VA_LOG(LERROR); }
  46. inline void errornf(size_t n, char const* fmt, ...) { VA_LOGN(LERROR, n); }
  47. inline void error(char const* msg) { log(LERROR, msg); }
  48. inline void error(std::string const& msg) { log(LERROR, msg); }
  49. inline void criticalf(char const* fmt, ...) { VA_LOG(LCRITICAL); }
  50. inline void criticalnf(size_t n, char const* fmt, ...) { VA_LOGN(LCRITICAL, n); }
  51. inline void critical(char const* msg) { log(LCRITICAL, msg); }
  52. inline void critical(std::string const& msg) { log(LCRITICAL, msg); }
  53. inline void fatalf(char const* fmt, ...) { VA_LOG(LFATAL); }
  54. inline void fatalnf(size_t n, char const* fmt, ...) { VA_LOGN(LFATAL, n); }
  55. inline void fatal(char const* msg) { log(LFATAL, msg); }
  56. inline void fatal(std::string const& msg) { log(LFATAL, msg); }
  57. template <typename... Args>
  58. inline void log(log_level ll, std::string const & interp, Args && ...args);
  59. void flush();
  60. ~c_logger();
  61. protected:
  62. friend class manager;
  63. c_logger(std::string const & name, std::shared_ptr<logger_impl> impl);
  64. private:
  65. void vlognf(log_level, size_t, char const*, va_list);
  66. void log(log_level, std::string const&);
  67. std::string get_header(log_level level);
  68. private:
  69. log_level min_level_;
  70. std::string logger_name_;
  71. std::shared_ptr<logger_impl> impl_;
  72. };
  73. }
  74. #undef VA_LOG
  75. #undef LA_LOGN