GKD.RoboCtrl
载入中...
搜索中...
未找到
logger.cpp
1#include "core/logger.h"
2
3#include <algorithm>
4#include <chrono>
5#include <ctime>
6#include <format>
7#include <iomanip>
8#include <iostream>
9#include <format>
10#include <print>
11#include <sstream>
12#include <utility>
13
14constexpr std::string_view _error_color = "\033[31m";
15constexpr std::string_view _info_color = "\033[32m";
16constexpr std::string_view _warn_color = "\033[33m";
17constexpr std::string_view _debug_color = "\033[34m";
18constexpr std::string_view _time_color = "\033[35m";
19constexpr std::string_view _role_color = "\033[36m";
20constexpr std::string_view _reset_color = "\033[0m";
21
22namespace {
23std::string current_timestamp() {
24 using namespace std::chrono;
25 const auto now = system_clock::now();
26 const auto time_t = system_clock::to_time_t(now);
27
28 std::tm tm_snapshot;
29#if defined(_WIN32)
30 localtime_s(&tm_snapshot, &time_t);
31#else
32 localtime_r(&time_t, &tm_snapshot);
33#endif
34
35 auto micros = duration_cast<microseconds>(now.time_since_epoch()) % 1'000'000;
36
37 std::ostringstream oss;
38 oss << std::put_time(&tm_snapshot, "%H:%M:%S")
39 << '.' << std::setw(6) << std::setfill('0') << micros.count();
40 return oss.str();
41}
42}
43
44void roboctrl::logger::set_level(log_level level) {
45 instance()._level.store(level);
46}
47
48roboctrl::log_level roboctrl::logger::level(){
49 return instance()._level.load();
50}
51
52void roboctrl::log::logger::set_filter(const std::string filter){
53 instance().filter_ = filter;
54}
55
56static inline std::string_view level_to_color(roboctrl::log_level level){
57 switch(level){
58 case roboctrl::log_level::Debug:
59 return _debug_color;
60 case roboctrl::log_level::Info:
61 return _info_color;
62 case roboctrl::log_level::Warn:
63 return _warn_color;
64 case roboctrl::log_level::Error:
65 return _error_color;
66 default:
67 std::unreachable();
68 }
69}
70
71void roboctrl::logger::log_impl(log_level level, std::string_view role, std::string_view message) {
72 std::scoped_lock lock(_mutex);
73 auto &stream = (level == log_level::Error) ? std::cerr : std::cout;
74 const auto role_view = role.empty() ? std::string_view{"-"} : role;
75
76 auto output = std::format("{}[{}]{} [{}] {}[{}]: {}{}{}",_time_color, current_timestamp(),level_to_color(level),
77 level_to_string(level),_role_color, role_view,level_to_color(level), message,_reset_color);
78
79
80 if(level >= log_level::Warn || output.contains(filter_))
81 std::println("{}",output);
82}
83
84std::string_view roboctrl::logger::level_to_string(log_level level) {
85 switch (level) {
86 case log_level::Debug:
87 return "DEBUG";
88 case log_level::Info:
89 return "INFO";
90 case log_level::Warn:
91 return "WARN";
92 case log_level::Error:
93 return "ERROR";
94 default:
95 return "UNKNOWN";
96 }
97}
static log_level level()
获取日志等级
Definition logger.cpp:48
static logger & instance()
获取单例实例
Definition singleton.hpp:29
用于日志输出的组件。
asio::awaitable< T > awaitable
协程任务类型。
Definition async.hpp:42
auto now()
记录程序启动后的纳秒级时间戳。
Definition utils.hpp:147