6 #include <boost/lexical_cast.hpp>
10 thread_local
int madara::logger::Logger::thread_level_(
13 thread_local
std::string madara::logger::Logger::thread_name_(
"");
15 thread_local
double madara::logger::Logger::thread_hertz_(
22 term_added_(log_to_terminal),
42 ret_str.replace(ret_str.find(ts_str), ts_str.length(), ts_str);
50 std::size_t found = 0;
51 std::size_t offset = 0;
53 const int MGT_DIGIT_PRECISION = 6;
68 found = ret_string.find(ts_str.c_str(), found + offset, ts_str.length());
69 if (found == std::string::npos)
76 if (ts_str == MADARA_GET_TIME_MGT_)
83 std::stringstream mgt_str;
87 mgt_str << std::setprecision(MGT_DIGIT_PRECISION) << std::fixed
90 ret_string.find(ts_str), ts_str.length(), mgt_str.str());
93 else if (ts_str == MADARA_THREAD_NAME_)
97 ret_string.replace(ret_string.find(ts_str), ts_str.length(),
98 madara::logger::Logger::get_thread_name());
101 ret_string.find(ts_str), ts_str.length(),
"<DISABLED>");
105 else if (ts_str == MADARA_THREAD_HERTZ_)
109 std::string hzstr = boost::lexical_cast<std::string>(
110 madara::logger::Logger::get_thread_hertz());
111 ret_string.replace(ret_string.find(ts_str), ts_str.length(), hzstr);
114 ret_string.find(ts_str), ts_str.length(),
"<DISABLED>");
126 level <= get_thread_level()) ||
130 va_start(argptr, message);
135 char* begin = (
char*)buffer;
136 size_t remaining_buffer =
sizeof(buffer);
138 if (this->timestamp_format_.size() > 0)
148 mad_str = search_and_insert_custom_tstamp(mad_str, MADARA_GET_TIME_MGT_);
149 mad_str = search_and_insert_custom_tstamp(mad_str, MADARA_THREAD_NAME_);
150 mad_str = search_and_insert_custom_tstamp(mad_str, MADARA_THREAD_HERTZ_);
152 char custom_buffer[10240];
153 std::strcpy(custom_buffer, mad_str.c_str());
163 struct tm* time_info;
166 time_info = localtime(&raw_time);
168 mad_str = search_and_insert_custom_tstamp(
169 timestamp_format_, MADARA_GET_TIME_MGT_);
170 mad_str = search_and_insert_custom_tstamp(mad_str, MADARA_THREAD_NAME_);
171 mad_str = search_and_insert_custom_tstamp(mad_str, MADARA_THREAD_HERTZ_);
177 size_t chars_written =
178 strftime(begin, remaining_buffer, mad_str.c_str(), time_info);
180 remaining_buffer -= chars_written;
181 begin += chars_written;
182 vsnprintf(begin, remaining_buffer, custom_buffer, argptr);
186 vsnprintf(begin, remaining_buffer, message, argptr);
191 MADARA_GUARD_TYPE guard(mutex_);
193 #ifdef _MADARA_ANDROID_
194 if (this->term_added_ || this->syslog_added_)
198 __android_log_write(ANDROID_LOG_ERROR, tag_.c_str(), buffer);
202 __android_log_write(ANDROID_LOG_WARN, tag_.c_str(), buffer);
206 __android_log_write(ANDROID_LOG_INFO, tag_.c_str(), buffer);
210 if (this->term_added_ || this->syslog_added_)
212 fprintf(stderr,
"%s", buffer);
217 for (FileVectors::iterator i = files_.begin(); i != files_.end(); ++i)
221 fprintf(stderr,
"Logger::log: writing to file num %d", file_num);
226 fprintf(*i,
"%s", buffer);
static int get_thread_level(void)
Fetches thread local storage value for thread level.
void add_term(void)
Adds terminal to logger outputs.
Logger(bool log_to_stderr=true)
Constructor.
std::string strip_custom_tstamp(const std::string in_str, const std::string ts_str)
Set thread local storage value for hertz.
std::string search_and_insert_custom_tstamp(const std::string &buf, const std::string &ts_str)
Set thread local storage value for hertz.
void log(int level, const char *message,...)
Logs a message to all available loggers.
const int TLS_THREAD_LEVEL_DEFAULT
const double TLS_THREAD_HZ_DEFAULT
int64_t get_time(void)
Returns a time of day in nanoseconds If simtime feature is enabled, this may be simulation time inste...