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