/* * logger.cc * * * Logger Library * * * Copyright (C) 2013-2017 Bryant Moscon - bmoscon@gmail.com * * Please see the LICENSE file for the terms and conditions * associated with this software. * */ #include "logger.hpp" #ifdef __ANDROID__ #define LOG_TAG "logger" #include #endif Logger::Logger(std::ostream& s) : _file(), _log(s), _level(INFO), _line_level(VERBOSE), _default_line_level(VERBOSE) { } Logger::Logger(const char *f) : _file(f, std::ios::out | std::ios::app), _log(_file), _level(INFO), _line_level(VERBOSE), _default_line_level(VERBOSE) { assert(_file.is_open()); } Logger::Logger(const std::string& f) : _file(f.c_str(), std::ios::out | std::ios::app), _log(_file), _level(INFO), _line_level(VERBOSE), _default_line_level(VERBOSE) { assert(_file.is_open()); } Logger::~Logger() { if (_file.is_open()) { _log.flush(); _file.close(); } else { _log.flush(); } } void Logger::set_level(const logger_level& level) { _level = level; } void Logger::set_default_line_level(const logger_level& level) { _default_line_level = level; } void Logger::flush() { if (_line_level >= _level) { _log << get_time() << " -- [" << level_str(_line_level) << "] -- " << str(); #ifdef __ANDROID__ std::stringstream& _log_ss(static_cast(_log)); __android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG, "%s", _log_ss.str().c_str());//#todo level convert _log_ss.str(""); #endif if (_file.is_open()) _log.flush(); } str(""); _line_level = _default_line_level; } Logger& Logger::operator<<(const logger_level& level) { _line_level = level; return (*this); } Logger& Logger::operator<<(LoggerManip m) { return m(*this); } std::string Logger::get_time() const { struct tm *timeinfo; time_t rawtime; char *time_buf; time(&rawtime); timeinfo = localtime(&rawtime); time_buf = asctime(timeinfo); std::string ret(time_buf); if (!ret.empty() && ret[ret.length() - 1] == '\n') { ret.erase(ret.length()-1); } return (ret); } inline const char* Logger::level_str(const logger_level& level) { switch (level) { case VERBOSE: return ("VRB"); case DEBUG: return ("DBG"); case INFO: return ("INF"); case NOTICE: return ("NOT"); case WARNING: return ("WRN"); case ERROR: return ("ERR"); case CRITICAL: return ("CRT"); default: assert(false); } }