Logger.cpp 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. /*
  2. * Author: Patrick-Christopher Mattulat
  3. * Company: Lynar Studios
  4. * E-Mail: webmaster@lynarstudios.com
  5. * Created: 2020-08-20
  6. * Changed: 2022-05-13
  7. *
  8. * */
  9. #include <ls_std/io/logging/Logger.hpp>
  10. #include <ctime>
  11. #include <iomanip>
  12. #include <ls_std/io/NewLine.hpp>
  13. #include <ls_std/boxing/String.hpp> // FIXME: remove "boxing" dependency from "io" module
  14. #include <ls_std/core/exception/IllegalArgumentException.hpp>
  15. ls::std::io::Logger::Logger(const ::std::shared_ptr<ls::std::core::IWriter> &_writer)
  16. : ls::std::core::Class("Logger"),
  17. logLevel(ls::std::io::LogLevelValue::INFO)
  18. {
  19. this->_assignWriter(_writer);
  20. }
  21. void ls::std::io::Logger::debug(const ls::std::core::type::byte *_data)
  22. {
  23. if (this->logLevel >= ls::std::io::LogLevelValue::DEBUG)
  24. {
  25. this->_log(_data, ls::std::io::LogLevel(ls::std::io::LogLevelValue::DEBUG));
  26. }
  27. }
  28. void ls::std::io::Logger::error(const ls::std::core::type::byte *_data)
  29. {
  30. if (this->logLevel >= ls::std::io::LogLevelValue::ERR)
  31. {
  32. this->_log(_data, ls::std::io::LogLevel(ls::std::io::LogLevelValue::ERR));
  33. }
  34. }
  35. void ls::std::io::Logger::fatal(const ls::std::core::type::byte *_data)
  36. {
  37. if (this->logLevel >= ls::std::io::LogLevelValue::FATAL)
  38. {
  39. this->_log(_data, ls::std::io::LogLevel(ls::std::io::LogLevelValue::FATAL));
  40. }
  41. }
  42. ls::std::io::LogLevel ls::std::io::Logger::getLogLevel()
  43. {
  44. return this->logLevel;
  45. }
  46. void ls::std::io::Logger::info(const ls::std::core::type::byte *_data)
  47. {
  48. if (this->logLevel >= ls::std::io::LogLevelValue::INFO)
  49. {
  50. this->_log(_data, ls::std::io::LogLevel(ls::std::io::LogLevelValue::INFO));
  51. }
  52. }
  53. void ls::std::io::Logger::setLogLevel(const ls::std::io::LogLevelValue &_logLevelValue)
  54. {
  55. this->logLevel = _logLevelValue;
  56. }
  57. void ls::std::io::Logger::trace(const ls::std::core::type::byte *_data)
  58. {
  59. if (this->logLevel >= ls::std::io::LogLevelValue::TRACE)
  60. {
  61. this->_log(_data, ls::std::io::LogLevel(ls::std::io::LogLevelValue::TRACE));
  62. }
  63. }
  64. void ls::std::io::Logger::warn(const ls::std::core::type::byte *_data)
  65. {
  66. if (this->logLevel >= ls::std::io::LogLevelValue::WARN)
  67. {
  68. this->_log(_data, ls::std::io::LogLevel(ls::std::io::LogLevelValue::WARN));
  69. }
  70. }
  71. void ls::std::io::Logger::_assignWriter(const ::std::shared_ptr<ls::std::core::IWriter> &_writer)
  72. {
  73. if (_writer == nullptr)
  74. {
  75. throw ls::std::core::IllegalArgumentException{};
  76. }
  77. this->writer = _writer;
  78. }
  79. ::std::string ls::std::io::Logger::_generateTimeString(tm *_localTime)
  80. {
  81. ::std::stringstream _stream{};
  82. _stream << ::std::put_time(_localTime, "%Y-%m-%d %H:%M:%S");
  83. return _stream.str();
  84. }
  85. void ls::std::io::Logger::_log(const ls::std::core::type::byte *_data, const ls::std::io::LogLevel &_logLevel)
  86. {
  87. time_t timestamp = ::std::time(nullptr);
  88. tm *localTime = ::std::localtime(&timestamp);
  89. ::std::string message = "[" + ls::std::io::Logger::_generateTimeString(localTime) + "] " + ls::std::boxing::String{_logLevel.toString() + ":"}.padRight(10, ' ') + ::std::string(_data) + ls::std::io::NewLine::getUnixNewLine();
  90. this->writer->write(message);
  91. }