CARLA
 
载入中...
搜索中...
未找到
Logging.h
浏览该文件的文档.
1// Copyright (c) 2017 Computer Vision Center (CVC) at the Universitat Autonoma
2// de Barcelona (UAB).
3//
4// This work is licensed under the terms of the MIT license.
5// For a copy, see <https://opensource.org/licenses/MIT>.
6
7#pragma once // 防止头文件被重复包含
8
9#include "carla/Platform.h" // 包含Carla平台的头文件
10// 定义日志级别的宏,用于控制日志输出的详细程度
11#define LIBCARLA_LOG_LEVEL_DEBUG 10
12#define LIBCARLA_LOG_LEVEL_INFO 20
13#define LIBCARLA_LOG_LEVEL_WARNING 30
14#define LIBCARLA_LOG_LEVEL_ERROR 40
15#define LIBCARLA_LOG_LEVEL_CRITICAL 50
16#define LIBCARLA_LOG_LEVEL_NONE 100
17
18#ifndef LIBCARLA_LOG_LEVEL
19# ifdef NDEBUG
20# define LIBCARLA_LOG_LEVEL LIBCARLA_LOG_LEVEL_WARNING // 如果没有定义NDEBUG,则设置为警告级别
21# else
22# define LIBCARLA_LOG_LEVEL LIBCARLA_LOG_LEVEL_INFO // 如果没有定义NDEBUG且没有指定日志级别,则设置为信息级别
23# endif // NDEBUG
24#endif // 结束对 LIBCARLA_LOG_LEVEL 是否未定义的检查
25
26// The following log functions are available, they are only active if
27// LIBCARLA_LOG_LEVEL is greater equal the function's log level.
28//
29// * log_debug
30// * log_info
31// * log_error
32// * log_critical
33//
34// And macros
35//
36// * LOG_DEBUG_ONLY(/* code here */)
37// * LOG_INFO_ONLY(/* code here */)
38
39// =============================================================================
40// -- Implementation of log functions ------------------------------------------
41// =============================================================================
42
43#include <iostream>
44
45namespace carla {
46
47namespace logging {
48
49 // https://stackoverflow.com/a/27375675
50 template <typename Arg, typename ... Args>
52 static void write_to_stream(std::ostream &out, Arg &&arg, Args && ... args) {
53 // 将第一个参数 arg 输出到流对象 out 中,设置 std::boolalpha 标志使得布尔类型的值以文本形式(true 或者 false)输出,通过 std::forward<Arg>(arg) 完美转发参数,保持其原始的左值或右值属性,避免不必要的拷贝或者移动开销。
54 out << std::boolalpha << std::forward<Arg>(arg);
55 // 通过定义一个匿名的 int 数组 expander,利用逗号表达式的求值特性,依次执行 (void(out << ' ' << std::forward<Args>(args)), 0) 这个表达式,实现将每个参数输出到流对象中,并且每个参数之间用空格隔开,最后一个参数输出后结束整个可变参数的处理过程。
56 using expander = int[];
57 (void) expander{0, (void(out << ' ' << std::forward<Args>(args)), 0) ...};
58 }
59 // 函数模板 log,它接受任意数量和类型的参数(通过可变参数模板实现),功能是将传入的所有参数依次输出到标准输出流(std::cout)中,并在最后输出一个换行符,实现简单的日志信息输出功能,调用了前面定义的 write_to_stream 函数来完成实际的参数输出操作。
60 template <typename ... Args>
61 static inline void log(Args && ... args) {
62 logging::write_to_stream(std::cout, std::forward<Args>(args) ..., '\n');
63 }
64
65} // namespace logging
66
67 // 如果当前定义的日志级别(LIBCARLA_LOG_LEVEL)小于等于DEBUG级别,定义log_debug函数模板,用于输出DEBUG级别的日志
68#if LIBCARLA_LOG_LEVEL <= LIBCARLA_LOG_LEVEL_DEBUG
69
70 template <typename ... Args>
71 static inline void log_debug(Args && ... args) {
72 // 在输出的日志内容前添加"DEBUG:"前缀,以标识这是DEBUG级别的日志,然后调用write_to_stream将参数输出到标准输出流(std::cout)
73 logging::write_to_stream(std::cout, "DEBUG:", std::forward<Args>(args) ..., '\n');
74 }
75 // 如果当前日志级别大于DEBUG级别,定义一个空的log_debug函数模板(即不执行任何实际操作),这样在该级别下不会输出DEBUG日志
76#else
77
78 template <typename ... Args>
79 static inline void log_debug(Args && ...) {}
80
81#endif
82 // 如果当前定义的日志级别(LIBCARLA_LOG_LEVEL)小于等于INFO级别,定义log_info函数模板,用于输出INFO级别的日志
83#if LIBCARLA_LOG_LEVEL <= LIBCARLA_LOG_LEVEL_INFO
84
85 template <typename ... Args>
86 static inline void log_info(Args && ... args) {
87 // 在输出的日志内容前添加"INFO: "前缀,以标识这是INFO级别的日志,然后调用write_to_stream将参数输出到标准输出流(std::cout)
88 logging::write_to_stream(std::cout, "INFO: ", std::forward<Args>(args) ..., '\n');
89 }
90 // 如果当前日志级别大于INFO级别,定义一个空的log_info函数模板(即不执行任何实际操作),这样在该级别下不会输出INFO日志
91#else
92
93 template <typename ... Args>
94 static inline void log_info(Args && ...) {}
95
96#endif
97 // 如果当前定义的日志级别(LIBCARLA_LOG_LEVEL)小于等于WARNING级别,定义log_warning函数模板,用于输出WARNING级别的日志
98#if LIBCARLA_LOG_LEVEL <= LIBCARLA_LOG_LEVEL_WARNING
99
100 template <typename ... Args>
101 static inline void log_warning(Args && ... args) {
102 logging::write_to_stream(std::cerr, "WARNING:", std::forward<Args>(args) ..., '\n');
103 }
104 // 如果当前日志级别大于WARNING级别,定义一个空的log_warning函数模板(即不执行任何实际操作),这样在该级别下不会输出WARNING日志
105#else
106
107 template <typename ... Args>
108 static inline void log_warning(Args && ...) {}
109
110#endif
111 // 如果当前定义的日志级别(LIBCARLA_LOG_LEVEL)小于等于ERROR级别,定义log_error函数模板,用于输出ERROR级别的日志
112#if LIBCARLA_LOG_LEVEL <= LIBCARLA_LOG_LEVEL_ERROR
113
114 template <typename ... Args>
115 static inline void log_error(Args && ... args) {
116 // 在输出的日志内容前添加"ERROR:"前缀,以标识这是ERROR级别的日志,然后调用write_to_stream将参数输出到标准错误输出流(std::cerr)
117 logging::write_to_stream(std::cerr, "ERROR:", std::forward<Args>(args) ..., '\n');
118 }
119 // 如果当前日志级别大于ERROR级别,定义一个空的log_error函数模板(即不执行任何实际操作),这样在该级别下不会输出ERROR日志
120#else
121
122 template <typename ... Args>
123 static inline void log_error(Args && ...) {}
124
125#endif
126 // 如果当前定义的日志级别(LIBCARLA_LOG_LEVEL)小于等于CRITICAL级别,定义log_critical函数模板,用于输出CRITICAL级别的日志
127#if LIBCARLA_LOG_LEVEL <= LIBCARLA_LOG_LEVEL_CRITICAL
128
129 template <typename ... Args>
130 static inline void log_critical(Args && ... args) {
131 // 在输出的日志内容前添加"CRITICAL:"前缀,以标识这是CRITICAL级别的日志,然后调用write_to_stream将参数输出到标准错误输出流(std::cerr)
132 logging::write_to_stream(std::cerr, "CRITICAL:", std::forward<Args>(args) ..., '\n');
133 }
134 // 如果当前日志级别大于CRITICAL级别,定义一个空的log_critical函数模板(即不执行任何实际操作),这样在该级别下不会输出CRITICAL日志
135#else
136
137 template <typename ... Args>
138 static inline void log_critical(Args && ...) {}
139
140#endif
141
142} // namespace carla
143
144// =============================================================================
145// -- Implementation of macros -------------------------------------------------
146// =============================================================================
147
148#if LIBCARLA_LOG_LEVEL <= LIBCARLA_LOG_LEVEL_DEBUG
149# define LOG_DEBUG_ONLY(code) code
150// 如果当前日志级别大于DEBUG级别,定义LOG_DEBUG_ONLY宏为空,即传入的代码片段不会执行,相当于在该级别下屏蔽了DEBUG相关代码块
151#else
152# define LOG_DEBUG_ONLY(code)
153#endif
154
155#if LIBCARLA_LOG_LEVEL <= LIBCARLA_LOG_LEVEL_INFO
156# define LOG_INFO_ONLY(code) code
157// 如果当前日志级别大于INFO级别,定义LOG_INFO_ONLY宏为空,即传入的代码片段不会执行,相当于在该级别下屏蔽了INFO相关代码块
158
159#else
160# define LOG_INFO_ONLY(code)
161#endif
#define LIBCARLA_NOINLINE
Definition Platform.h:28
static LIBCARLA_NOINLINE void write_to_stream(std::ostream &out, Arg &&arg, Args &&... args)
Definition Logging.h:52
static void log(Args &&... args)
Definition Logging.h:61
CARLA模拟器的主命名空间。
Definition Carla.cpp:139
static void log_error(Args &&... args)
Definition Logging.h:115
static void log_info(Args &&... args)
Definition Logging.h:86
static void log_warning(Args &&... args)
Definition Logging.h:101
static void log_critical(Args &&... args)
Definition Logging.h:130
static void log_debug(Args &&... args)
Definition Logging.h:71