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