You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

138 lines
3.4 KiB

  1. #pragma once
  2. #include <cxxabi.h>
  3. #include "logger.h"
  4. namespace cpplogging
  5. {
  6. namespace __impl
  7. {
  8. /* log_helper */
  9. log_helper
  10. ::log_helper(logger& p_logger)
  11. : _logger (p_logger)
  12. , _entry (new log_entry())
  13. { _entry->name = p_logger.name(); }
  14. log_helper
  15. ::log_helper(logger& p_logger, const log_entry_ptr_s& p_entry)
  16. : _logger (p_logger)
  17. , _entry (p_entry)
  18. { _entry->name = p_logger.name(); }
  19. log_helper
  20. ::~log_helper()
  21. {
  22. _entry->message += str();
  23. _logger.write_entry(_entry);
  24. }
  25. log_helper& log_helper
  26. ::level(log_level level)
  27. {
  28. _entry->level = level;
  29. return *this;
  30. }
  31. log_helper& log_helper
  32. ::sender(const void * sender)
  33. {
  34. _entry->sender = sender;
  35. return *this;
  36. }
  37. template<typename T_sender>
  38. log_helper& log_helper
  39. ::sender(const T_sender * sender)
  40. {
  41. int status;
  42. auto name = abi::__cxa_demangle(typeid(T_sender).name(), 0, 0, &status);
  43. _entry->sender_type = std::string(name ? name : typeid(T_sender).name());
  44. _entry->sender = sender;
  45. return *this;
  46. }
  47. log_helper& log_helper
  48. ::sender_type(const std::string& sender_type)
  49. {
  50. _entry->sender_type = sender_type;
  51. return *this;
  52. }
  53. log_helper& log_helper
  54. ::file(const char * file)
  55. {
  56. _entry->file = file;
  57. return *this;
  58. }
  59. log_helper& log_helper
  60. ::line(int line)
  61. {
  62. _entry->line = line;
  63. return *this;
  64. }
  65. log_helper& log_helper
  66. ::message(const std::string& msg)
  67. {
  68. _entry->message = msg;
  69. return *this;
  70. }
  71. log_helper& log_helper
  72. ::add_message(const std::string& msg)
  73. {
  74. _entry->message += msg;
  75. return *this;
  76. }
  77. template<typename... T_args>
  78. log_helper& log_helper
  79. ::format(const std::string& fmt, T_args&&... args)
  80. {
  81. _entry->message = format(fmt, 0x8000, std::forward<T_args>(args)...);
  82. return *this;
  83. }
  84. template<typename... T_args>
  85. log_helper& log_helper
  86. ::add_format(const std::string& fmt, T_args&&... args)
  87. {
  88. _entry->message += format(fmt, 0x8000, std::forward<T_args>(args)...);
  89. return *this;
  90. }
  91. template<typename... T_args>
  92. std::string log_helper
  93. ::format(const std::string& fmt, size_t sz, T_args&&... args)
  94. {
  95. std::unique_ptr<char, decltype(&free)> buff(static_cast<char*>(malloc(sz)), &free);
  96. auto len = snprintf(buff.get(), sz, fmt.c_str(), std::forward<T_args>(args)...);
  97. if (len < 0)
  98. throw std::runtime_error("unable to format string");
  99. return std::string(buff.get(), len);
  100. }
  101. }
  102. /* logger */
  103. logger
  104. ::logger(const std::string name)
  105. : _name(name)
  106. { }
  107. const std::string& logger
  108. ::name() const
  109. { return _name; }
  110. __impl::log_helper logger
  111. ::log()
  112. { return __impl::log_helper(*this); }
  113. }