8 #include "../details/log_msg.h" 9 #include "../details/os.h" 10 #include "../fmt/fmt.h" 11 #include "../formatter.h" 39 msg.formatted << *msg.logger_name;
48 msg.formatted << level::to_str(msg.level);
57 msg.formatted << level::to_short_str(msg.level);
65 static const char *ampm(
const tm &t)
67 return t.tm_hour >= 12 ?
"PM" :
"AM";
70 static int to12h(
const tm &t)
72 return t.tm_hour > 12 ? t.tm_hour - 12 : t.tm_hour;
76 static const std::string days[]{
"Sun",
"Mon",
"Tue",
"Wed",
"Thu",
"Fri",
"Sat"};
81 msg.formatted << days[tm_time.tm_wday];
86 static const std::string full_days[]{
"Sunday",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday"};
91 msg.formatted << full_days[tm_time.tm_wday];
96 static const std::string months[]{
"Jan",
"Feb",
"Mar",
"Apr",
"May",
"Jun",
"Jul",
"Aug",
"Sept",
"Oct",
"Nov",
"Dec"};
101 msg.formatted << months[tm_time.tm_mon];
106 static const std::string full_months[]{
107 "January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December"};
112 msg.formatted << full_months[tm_time.tm_mon];
119 w << fmt::pad(v1, 2,
'0') << sep << fmt::pad(v2, 2,
'0');
126 w << fmt::pad(v1, 2,
'0') << sep << fmt::pad(v2, 2,
'0') << sep << fmt::pad(v3, 2,
'0');
135 msg.formatted << days[tm_time.tm_wday] <<
' ' << months[tm_time.tm_mon] <<
' ' << tm_time.tm_mday <<
' ';
136 pad_n_join(msg.formatted, tm_time.tm_hour, tm_time.tm_min, tm_time.tm_sec,
':') <<
' ' << tm_time.tm_year + 1900;
145 msg.formatted << fmt::pad(tm_time.tm_year % 100, 2,
'0');
154 pad_n_join(msg.formatted, tm_time.tm_mon + 1, tm_time.tm_mday, tm_time.tm_year % 100,
'/');
163 msg.formatted << tm_time.tm_year + 1900;
172 msg.formatted << fmt::pad(tm_time.tm_mon + 1, 2,
'0');
181 msg.formatted << fmt::pad(tm_time.tm_mday, 2,
'0');
190 msg.formatted << fmt::pad(tm_time.tm_hour, 2,
'0');
199 msg.formatted << fmt::pad(to12h(tm_time), 2,
'0');
208 msg.formatted << fmt::pad(tm_time.tm_min, 2,
'0');
217 msg.formatted << fmt::pad(tm_time.tm_sec, 2,
'0');
226 auto duration = msg.time.time_since_epoch();
227 auto millis = std::chrono::duration_cast<std::chrono::milliseconds>(duration).count() % 1000;
228 msg.formatted << fmt::pad(static_cast<int>(millis), 3,
'0');
237 auto duration = msg.time.time_since_epoch();
238 auto micros = std::chrono::duration_cast<std::chrono::microseconds>(duration).count() % 1000000;
239 msg.formatted << fmt::pad(static_cast<int>(micros), 6,
'0');
248 auto duration = msg.time.time_since_epoch();
249 auto ns = std::chrono::duration_cast<std::chrono::nanoseconds>(duration).count() % 1000000000;
250 msg.formatted << fmt::pad(static_cast<int>(ns), 9,
'0');
258 auto duration = msg.time.time_since_epoch();
259 auto seconds = std::chrono::duration_cast<std::chrono::seconds>(duration).count();
260 msg.formatted << seconds;
269 msg.formatted << ampm(tm_time);
278 pad_n_join(msg.formatted, to12h(tm_time), tm_time.tm_min, tm_time.tm_sec,
':') <<
' ' << ampm(tm_time);
287 pad_n_join(msg.formatted, tm_time.tm_hour, tm_time.tm_min,
':');
296 pad_n_join(msg.formatted, tm_time.tm_hour, tm_time.tm_min, tm_time.tm_sec,
':');
304 const std::chrono::seconds cache_refresh = std::chrono::seconds(5);
306 z_formatter() =
default;
307 z_formatter(
const z_formatter &) =
delete;
308 z_formatter &operator=(
const z_formatter &) =
delete;
313 int total_minutes = get_cached_offset(msg, tm_time);
317 int total_minutes = os::utc_minutes_offset(tm_time);
319 bool is_negative = total_minutes < 0;
323 total_minutes = -total_minutes;
331 int h = total_minutes / 60;
332 int m = total_minutes % 60;
333 msg.formatted << sign;
334 pad_n_join(msg.formatted, h, m,
':');
338 log_clock::time_point _last_update{std::chrono::seconds(0)};
339 int _offset_minutes{0};
342 int get_cached_offset(
const log_msg &msg,
const std::tm &tm_time)
344 std::lock_guard<std::mutex> l(_mutex);
345 if (msg.time - _last_update >= cache_refresh)
347 _offset_minutes = os::utc_minutes_offset(tm_time);
348 _last_update = msg.time;
350 return _offset_minutes;
359 msg.formatted << msg.thread_id;
368 msg.formatted << details::os::pid();
377 msg.formatted << fmt::pad(msg.msg_id, 6,
'0');
392 explicit ch_formatter(
char ch)
398 msg.formatted << _ch;
409 aggregate_formatter() =
default;
417 msg.formatted << _str;
429 msg.color_range_start = msg.formatted.
size();
436 msg.color_range_end = msg.formatted.
size();
446 #ifndef SPDLOG_NO_DATETIME 447 auto duration = msg.time.time_since_epoch();
448 auto millis = std::chrono::duration_cast<std::chrono::milliseconds>(duration).count() % 1000;
464 msg.formatted <<
'[' <<
static_cast<unsigned int>(tm_time.tm_year + 1900) <<
'-' 465 << fmt::pad(static_cast<unsigned int>(tm_time.tm_mon + 1), 2,
'0') <<
'-' 466 << fmt::pad(static_cast<unsigned int>(tm_time.tm_mday), 2,
'0') <<
' ' 467 << fmt::pad(static_cast<unsigned int>(tm_time.tm_hour), 2,
'0') <<
':' 468 << fmt::pad(static_cast<unsigned int>(tm_time.tm_min), 2,
'0') <<
':' 469 << fmt::pad(static_cast<unsigned int>(tm_time.tm_sec), 2,
'0') <<
'.' 470 << fmt::pad(static_cast<unsigned int>(millis), 3,
'0') <<
"] ";
477 #ifndef SPDLOG_NO_NAME 478 msg.formatted <<
'[' << *msg.logger_name <<
"] ";
481 msg.formatted <<
'[';
483 msg.color_range_start = msg.formatted.
size();
484 msg.formatted << level::to_str(msg.level);
485 msg.color_range_end = msg.formatted.
size();
495 inline spdlog::pattern_formatter::pattern_formatter(
const std::string &pattern, pattern_time_type pattern_time, std::string eol)
496 : _eol(std::move(eol))
497 , _pattern_time(pattern_time)
499 compile_pattern(pattern);
502 inline void spdlog::pattern_formatter::compile_pattern(
const std::string &pattern)
504 auto end = pattern.end();
505 std::unique_ptr<details::aggregate_formatter> user_chars;
506 for (
auto it = pattern.begin(); it != end; ++it)
512 _formatters.push_back(std::move(user_chars));
528 user_chars = std::unique_ptr<details::aggregate_formatter>(
new details::aggregate_formatter());
530 user_chars->add_ch(*it);
535 _formatters.push_back(std::move(user_chars));
538 inline void spdlog::pattern_formatter::handle_flag(
char flag)
556 _formatters.emplace_back(
new details::t_formatter());
560 _formatters.emplace_back(
new details::v_formatter());
580 _formatters.emplace_back(
new details::c_formatter());
584 _formatters.emplace_back(
new details::C_formatter());
588 _formatters.emplace_back(
new details::Y_formatter());
594 _formatters.emplace_back(
new details::D_formatter());
598 _formatters.emplace_back(
new details::m_formatter());
602 _formatters.emplace_back(
new details::d_formatter());
606 _formatters.emplace_back(
new details::H_formatter());
610 _formatters.emplace_back(
new details::I_formatter());
614 _formatters.emplace_back(
new details::M_formatter());
618 _formatters.emplace_back(
new details::S_formatter());
622 _formatters.emplace_back(
new details::e_formatter());
626 _formatters.emplace_back(
new details::f_formatter());
629 _formatters.emplace_back(
new details::F_formatter());
633 _formatters.emplace_back(
new details::E_formatter());
637 _formatters.emplace_back(
new details::p_formatter());
641 _formatters.emplace_back(
new details::r_formatter());
645 _formatters.emplace_back(
new details::R_formatter());
650 _formatters.emplace_back(
new details::T_formatter());
654 _formatters.emplace_back(
new details::z_formatter());
658 _formatters.emplace_back(
new details::full_formatter());
662 _formatters.emplace_back(
new details::pid_formatter());
666 _formatters.emplace_back(
new details::i_formatter());
670 _formatters.emplace_back(
new details::color_start_formatter());
674 _formatters.emplace_back(
new details::color_stop_formatter());
678 _formatters.emplace_back(
new details::ch_formatter(
'%'));
679 _formatters.emplace_back(
new details::ch_formatter(flag));
686 if (_pattern_time == pattern_time_type::local)
688 return details::os::localtime(log_clock::to_time_t(msg.time));
690 return details::os::gmtime(log_clock::to_time_t(msg.time));
696 #ifndef SPDLOG_NO_DATETIME 697 auto tm_time = get_time(msg);
701 for (
auto &f : _formatters)
703 f->format(msg, tm_time);
706 msg.formatted << _eol;
const Char * data() const FMT_NOEXCEPT
Definition: format.h:3280
Definition: async_logger.h:26
std::size_t size() const
Definition: format.h:3271
Definition: pattern_formatter_impl.h:131
Definition: format.h:3924