xref: /aosp_15_r20/external/executorch/runtime/platform/log.h (revision 523fa7a60841cd1ecfb9cc4201f1ca8b03ed023a)
1*523fa7a6SAndroid Build Coastguard Worker /*
2*523fa7a6SAndroid Build Coastguard Worker  * Copyright (c) Meta Platforms, Inc. and affiliates.
3*523fa7a6SAndroid Build Coastguard Worker  * All rights reserved.
4*523fa7a6SAndroid Build Coastguard Worker  *
5*523fa7a6SAndroid Build Coastguard Worker  * This source code is licensed under the BSD-style license found in the
6*523fa7a6SAndroid Build Coastguard Worker  * LICENSE file in the root directory of this source tree.
7*523fa7a6SAndroid Build Coastguard Worker  */
8*523fa7a6SAndroid Build Coastguard Worker 
9*523fa7a6SAndroid Build Coastguard Worker /**
10*523fa7a6SAndroid Build Coastguard Worker  * @file
11*523fa7a6SAndroid Build Coastguard Worker  * ExecuTorch logging API.
12*523fa7a6SAndroid Build Coastguard Worker  */
13*523fa7a6SAndroid Build Coastguard Worker 
14*523fa7a6SAndroid Build Coastguard Worker #pragma once
15*523fa7a6SAndroid Build Coastguard Worker 
16*523fa7a6SAndroid Build Coastguard Worker #include <cstdarg>
17*523fa7a6SAndroid Build Coastguard Worker #include <cstddef>
18*523fa7a6SAndroid Build Coastguard Worker #include <cstdlib>
19*523fa7a6SAndroid Build Coastguard Worker 
20*523fa7a6SAndroid Build Coastguard Worker #include <executorch/runtime/platform/compiler.h>
21*523fa7a6SAndroid Build Coastguard Worker #include <executorch/runtime/platform/types.h>
22*523fa7a6SAndroid Build Coastguard Worker 
23*523fa7a6SAndroid Build Coastguard Worker // Set minimum log severity if compiler option is not provided.
24*523fa7a6SAndroid Build Coastguard Worker #ifndef ET_MIN_LOG_LEVEL
25*523fa7a6SAndroid Build Coastguard Worker #define ET_MIN_LOG_LEVEL Info
26*523fa7a6SAndroid Build Coastguard Worker #endif // !defined(ET_MIN_LOG_LEVEL)
27*523fa7a6SAndroid Build Coastguard Worker 
28*523fa7a6SAndroid Build Coastguard Worker /*
29*523fa7a6SAndroid Build Coastguard Worker  * Enable logging by default if compiler option is not provided.
30*523fa7a6SAndroid Build Coastguard Worker  * This should facilitate less confusion for those developing ExecuTorch.
31*523fa7a6SAndroid Build Coastguard Worker  */
32*523fa7a6SAndroid Build Coastguard Worker #ifndef ET_LOG_ENABLED
33*523fa7a6SAndroid Build Coastguard Worker #define ET_LOG_ENABLED 1
34*523fa7a6SAndroid Build Coastguard Worker #endif // !defined(ET_LOG_ENABLED)
35*523fa7a6SAndroid Build Coastguard Worker 
36*523fa7a6SAndroid Build Coastguard Worker namespace executorch {
37*523fa7a6SAndroid Build Coastguard Worker namespace runtime {
38*523fa7a6SAndroid Build Coastguard Worker 
39*523fa7a6SAndroid Build Coastguard Worker /**
40*523fa7a6SAndroid Build Coastguard Worker  * Severity level of a log message. Must be ordered from lowest to highest
41*523fa7a6SAndroid Build Coastguard Worker  * severity.
42*523fa7a6SAndroid Build Coastguard Worker  */
43*523fa7a6SAndroid Build Coastguard Worker enum class LogLevel : uint8_t {
44*523fa7a6SAndroid Build Coastguard Worker   /**
45*523fa7a6SAndroid Build Coastguard Worker    * Log messages provided for highly granular debuggability.
46*523fa7a6SAndroid Build Coastguard Worker    *
47*523fa7a6SAndroid Build Coastguard Worker    * Log messages using this severity are unlikely to be compiled by default
48*523fa7a6SAndroid Build Coastguard Worker    * into most debug builds.
49*523fa7a6SAndroid Build Coastguard Worker    */
50*523fa7a6SAndroid Build Coastguard Worker   Debug,
51*523fa7a6SAndroid Build Coastguard Worker 
52*523fa7a6SAndroid Build Coastguard Worker   /**
53*523fa7a6SAndroid Build Coastguard Worker    * Log messages providing information about the state of the system
54*523fa7a6SAndroid Build Coastguard Worker    * for debuggability.
55*523fa7a6SAndroid Build Coastguard Worker    */
56*523fa7a6SAndroid Build Coastguard Worker   Info,
57*523fa7a6SAndroid Build Coastguard Worker 
58*523fa7a6SAndroid Build Coastguard Worker   /**
59*523fa7a6SAndroid Build Coastguard Worker    * Log messages about errors within ExecuTorch during runtime.
60*523fa7a6SAndroid Build Coastguard Worker    */
61*523fa7a6SAndroid Build Coastguard Worker   Error,
62*523fa7a6SAndroid Build Coastguard Worker 
63*523fa7a6SAndroid Build Coastguard Worker   /**
64*523fa7a6SAndroid Build Coastguard Worker    * Log messages that precede a fatal error. However, logging at this level
65*523fa7a6SAndroid Build Coastguard Worker    * does not perform the actual abort, something else needs to.
66*523fa7a6SAndroid Build Coastguard Worker    */
67*523fa7a6SAndroid Build Coastguard Worker   Fatal,
68*523fa7a6SAndroid Build Coastguard Worker 
69*523fa7a6SAndroid Build Coastguard Worker   /**
70*523fa7a6SAndroid Build Coastguard Worker    * Number of supported log levels, with values in [0, NumLevels).
71*523fa7a6SAndroid Build Coastguard Worker    */
72*523fa7a6SAndroid Build Coastguard Worker   NumLevels,
73*523fa7a6SAndroid Build Coastguard Worker };
74*523fa7a6SAndroid Build Coastguard Worker 
75*523fa7a6SAndroid Build Coastguard Worker namespace internal {
76*523fa7a6SAndroid Build Coastguard Worker 
77*523fa7a6SAndroid Build Coastguard Worker /**
78*523fa7a6SAndroid Build Coastguard Worker  * Get the current timestamp to construct a log event.
79*523fa7a6SAndroid Build Coastguard Worker  *
80*523fa7a6SAndroid Build Coastguard Worker  * @retval Monotonically non-decreasing timestamp in system ticks.
81*523fa7a6SAndroid Build Coastguard Worker  */
82*523fa7a6SAndroid Build Coastguard Worker et_timestamp_t get_log_timestamp();
83*523fa7a6SAndroid Build Coastguard Worker 
84*523fa7a6SAndroid Build Coastguard Worker /**
85*523fa7a6SAndroid Build Coastguard Worker  * Log a string message.
86*523fa7a6SAndroid Build Coastguard Worker  *
87*523fa7a6SAndroid Build Coastguard Worker  * Note: This is an internal function. Use the `ET_LOG` macro instead.
88*523fa7a6SAndroid Build Coastguard Worker  *
89*523fa7a6SAndroid Build Coastguard Worker  * @param[in] level Log severity level.
90*523fa7a6SAndroid Build Coastguard Worker  * @param[in] timestamp Timestamp (in system ticks) of the log event.
91*523fa7a6SAndroid Build Coastguard Worker  * @param[in] filename Name of the source file creating the log event.
92*523fa7a6SAndroid Build Coastguard Worker  * @param[in] function Name of the function creating the log event.
93*523fa7a6SAndroid Build Coastguard Worker  * @param[in] line Source file line of the caller.
94*523fa7a6SAndroid Build Coastguard Worker  * @param[in] format Format string.
95*523fa7a6SAndroid Build Coastguard Worker  * @param[in] args Variable argument list.
96*523fa7a6SAndroid Build Coastguard Worker  */
97*523fa7a6SAndroid Build Coastguard Worker ET_PRINTFLIKE(6, 0)
98*523fa7a6SAndroid Build Coastguard Worker void vlogf(
99*523fa7a6SAndroid Build Coastguard Worker     LogLevel level,
100*523fa7a6SAndroid Build Coastguard Worker     et_timestamp_t timestamp,
101*523fa7a6SAndroid Build Coastguard Worker     const char* filename,
102*523fa7a6SAndroid Build Coastguard Worker     const char* function,
103*523fa7a6SAndroid Build Coastguard Worker     size_t line,
104*523fa7a6SAndroid Build Coastguard Worker     const char* format,
105*523fa7a6SAndroid Build Coastguard Worker     va_list args);
106*523fa7a6SAndroid Build Coastguard Worker 
107*523fa7a6SAndroid Build Coastguard Worker /**
108*523fa7a6SAndroid Build Coastguard Worker  * Log a string message.
109*523fa7a6SAndroid Build Coastguard Worker  *
110*523fa7a6SAndroid Build Coastguard Worker  * Note: This is an internal function. Use the `ET_LOG` macro instead.
111*523fa7a6SAndroid Build Coastguard Worker  *
112*523fa7a6SAndroid Build Coastguard Worker  * @param[in] level Log severity level.
113*523fa7a6SAndroid Build Coastguard Worker  * @param[in] timestamp Timestamp (in system ticks) of the log event.
114*523fa7a6SAndroid Build Coastguard Worker  * @param[in] filename Name of the source file creating the log event.
115*523fa7a6SAndroid Build Coastguard Worker  * @param[in] function Name of the function creating the log event.
116*523fa7a6SAndroid Build Coastguard Worker  * @param[in] line Source file line of the caller.
117*523fa7a6SAndroid Build Coastguard Worker  * @param[in] format Format string.
118*523fa7a6SAndroid Build Coastguard Worker  */
119*523fa7a6SAndroid Build Coastguard Worker ET_PRINTFLIKE(6, 7)
logf(LogLevel level,et_timestamp_t timestamp,const char * filename,const char * function,size_t line,const char * format,...)120*523fa7a6SAndroid Build Coastguard Worker inline void logf(
121*523fa7a6SAndroid Build Coastguard Worker     LogLevel level,
122*523fa7a6SAndroid Build Coastguard Worker     et_timestamp_t timestamp,
123*523fa7a6SAndroid Build Coastguard Worker     const char* filename,
124*523fa7a6SAndroid Build Coastguard Worker     const char* function,
125*523fa7a6SAndroid Build Coastguard Worker     size_t line,
126*523fa7a6SAndroid Build Coastguard Worker     const char* format,
127*523fa7a6SAndroid Build Coastguard Worker     ...) {
128*523fa7a6SAndroid Build Coastguard Worker #if ET_LOG_ENABLED
129*523fa7a6SAndroid Build Coastguard Worker   va_list args;
130*523fa7a6SAndroid Build Coastguard Worker   va_start(args, format);
131*523fa7a6SAndroid Build Coastguard Worker   internal::vlogf(level, timestamp, filename, function, line, format, args);
132*523fa7a6SAndroid Build Coastguard Worker   va_end(args);
133*523fa7a6SAndroid Build Coastguard Worker #endif // ET_LOG_ENABLED
134*523fa7a6SAndroid Build Coastguard Worker }
135*523fa7a6SAndroid Build Coastguard Worker 
136*523fa7a6SAndroid Build Coastguard Worker } // namespace internal
137*523fa7a6SAndroid Build Coastguard Worker 
138*523fa7a6SAndroid Build Coastguard Worker } // namespace runtime
139*523fa7a6SAndroid Build Coastguard Worker } // namespace executorch
140*523fa7a6SAndroid Build Coastguard Worker 
141*523fa7a6SAndroid Build Coastguard Worker namespace torch {
142*523fa7a6SAndroid Build Coastguard Worker namespace executor {
143*523fa7a6SAndroid Build Coastguard Worker // TODO(T197294990): Remove these deprecated aliases once all users have moved
144*523fa7a6SAndroid Build Coastguard Worker // to the new `::executorch` namespaces.
145*523fa7a6SAndroid Build Coastguard Worker using ::executorch::runtime::LogLevel;
146*523fa7a6SAndroid Build Coastguard Worker } // namespace executor
147*523fa7a6SAndroid Build Coastguard Worker } // namespace torch
148*523fa7a6SAndroid Build Coastguard Worker 
149*523fa7a6SAndroid Build Coastguard Worker #if ET_LOG_ENABLED
150*523fa7a6SAndroid Build Coastguard Worker 
151*523fa7a6SAndroid Build Coastguard Worker /**
152*523fa7a6SAndroid Build Coastguard Worker  * Log a message at the given log severity level.
153*523fa7a6SAndroid Build Coastguard Worker  *
154*523fa7a6SAndroid Build Coastguard Worker  * @param[in] _level Log severity level.
155*523fa7a6SAndroid Build Coastguard Worker  * @param[in] _format Log message format string.
156*523fa7a6SAndroid Build Coastguard Worker  */
157*523fa7a6SAndroid Build Coastguard Worker #define ET_LOG(_level, _format, ...)                                 \
158*523fa7a6SAndroid Build Coastguard Worker   do {                                                               \
159*523fa7a6SAndroid Build Coastguard Worker     const auto _log_level = ::executorch::runtime::LogLevel::_level; \
160*523fa7a6SAndroid Build Coastguard Worker     if (static_cast<uint32_t>(_log_level) >=                         \
161*523fa7a6SAndroid Build Coastguard Worker         static_cast<uint32_t>(                                       \
162*523fa7a6SAndroid Build Coastguard Worker             ::executorch::runtime::LogLevel::ET_MIN_LOG_LEVEL)) {    \
163*523fa7a6SAndroid Build Coastguard Worker       const auto _timestamp =                                        \
164*523fa7a6SAndroid Build Coastguard Worker           ::executorch::runtime::internal::get_log_timestamp();      \
165*523fa7a6SAndroid Build Coastguard Worker       ::executorch::runtime::internal::logf(                         \
166*523fa7a6SAndroid Build Coastguard Worker           _log_level,                                                \
167*523fa7a6SAndroid Build Coastguard Worker           _timestamp,                                                \
168*523fa7a6SAndroid Build Coastguard Worker           ET_SHORT_FILENAME,                                         \
169*523fa7a6SAndroid Build Coastguard Worker           ET_FUNCTION,                                               \
170*523fa7a6SAndroid Build Coastguard Worker           ET_LINE,                                                   \
171*523fa7a6SAndroid Build Coastguard Worker           _format,                                                   \
172*523fa7a6SAndroid Build Coastguard Worker           ##__VA_ARGS__);                                            \
173*523fa7a6SAndroid Build Coastguard Worker     }                                                                \
174*523fa7a6SAndroid Build Coastguard Worker   } while (0)
175*523fa7a6SAndroid Build Coastguard Worker #else // ET_LOG_ENABLED
176*523fa7a6SAndroid Build Coastguard Worker 
177*523fa7a6SAndroid Build Coastguard Worker /**
178*523fa7a6SAndroid Build Coastguard Worker  * Log a message at the given log severity level.
179*523fa7a6SAndroid Build Coastguard Worker  *
180*523fa7a6SAndroid Build Coastguard Worker  * @param[in] _level Log severity level.
181*523fa7a6SAndroid Build Coastguard Worker  * @param[in] _format Log message format string.
182*523fa7a6SAndroid Build Coastguard Worker  */
183*523fa7a6SAndroid Build Coastguard Worker #define ET_LOG(_level, _format, ...) ((void)0)
184*523fa7a6SAndroid Build Coastguard Worker 
185*523fa7a6SAndroid Build Coastguard Worker #endif // ET_LOG_ENABLED
186