blob: 2b1e791b065004af4c91f4738c536f0f51d9081c [file] [log] [blame]
/*
* Copyright (c) Meta Platforms, Inc. and affiliates.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree.
*/
/**
* @file
* ExecuTorch logging API.
*/
#pragma once
#include <cstdarg>
#include <cstddef>
#include <cstdlib>
#include <executorch/runtime/platform/compiler.h>
#include <executorch/runtime/platform/types.h>
// Set minimum log severity if compiler option is not provided.
#ifndef ET_MIN_LOG_LEVEL
#define ET_MIN_LOG_LEVEL Info
#endif // !defined(ET_MIN_LOG_LEVEL)
/*
* Enable logging by default if compiler option is not provided.
* This should facilitate less confusion for those developing ExecuTorch.
*/
#ifndef ET_LOG_ENABLED
#define ET_LOG_ENABLED 1
#endif // !defined(ET_LOG_ENABLED)
namespace executorch {
namespace runtime {
/**
* Severity level of a log message. Must be ordered from lowest to highest
* severity.
*/
enum class LogLevel : uint8_t {
/**
* Log messages provided for highly granular debuggability.
*
* Log messages using this severity are unlikely to be compiled by default
* into most debug builds.
*/
Debug,
/**
* Log messages providing information about the state of the system
* for debuggability.
*/
Info,
/**
* Log messages about errors within ExecuTorch during runtime.
*/
Error,
/**
* Log messages that precede a fatal error. However, logging at this level
* does not perform the actual abort, something else needs to.
*/
Fatal,
/**
* Number of supported log levels, with values in [0, NumLevels).
*/
NumLevels,
};
namespace internal {
/**
* Get the current timestamp to construct a log event.
*
* @retval Monotonically non-decreasing timestamp in system ticks.
*/
et_timestamp_t get_log_timestamp();
/**
* Log a string message.
*
* Note: This is an internal function. Use the `ET_LOG` macro instead.
*
* @param[in] level Log severity level.
* @param[in] timestamp Timestamp (in system ticks) of the log event.
* @param[in] filename Name of the source file creating the log event.
* @param[in] function Name of the function creating the log event.
* @param[in] line Source file line of the caller.
* @param[in] format Format string.
* @param[in] args Variable argument list.
*/
ET_PRINTFLIKE(6, 0)
void vlogf(
LogLevel level,
et_timestamp_t timestamp,
const char* filename,
const char* function,
size_t line,
const char* format,
va_list args);
/**
* Log a string message.
*
* Note: This is an internal function. Use the `ET_LOG` macro instead.
*
* @param[in] level Log severity level.
* @param[in] timestamp Timestamp (in system ticks) of the log event.
* @param[in] filename Name of the source file creating the log event.
* @param[in] function Name of the function creating the log event.
* @param[in] line Source file line of the caller.
* @param[in] format Format string.
*/
ET_PRINTFLIKE(6, 7)
inline void logf(
LogLevel level,
et_timestamp_t timestamp,
const char* filename,
const char* function,
size_t line,
const char* format,
...) {
#if ET_LOG_ENABLED
va_list args;
va_start(args, format);
internal::vlogf(level, timestamp, filename, function, line, format, args);
va_end(args);
#endif // ET_LOG_ENABLED
}
} // namespace internal
} // namespace runtime
} // namespace executorch
namespace torch {
namespace executor {
// TODO(T197294990): Remove these deprecated aliases once all users have moved
// to the new `::executorch` namespaces.
using ::executorch::runtime::LogLevel;
} // namespace executor
} // namespace torch
#if ET_LOG_ENABLED
/**
* Log a message at the given log severity level.
*
* @param[in] _level Log severity level.
* @param[in] _format Log message format string.
*/
#define ET_LOG(_level, _format, ...) \
({ \
const auto _log_level = ::executorch::runtime::LogLevel::_level; \
if (static_cast<uint32_t>(_log_level) >= \
static_cast<uint32_t>( \
::executorch::runtime::LogLevel::ET_MIN_LOG_LEVEL)) { \
const auto _timestamp = \
::executorch::runtime::internal::get_log_timestamp(); \
::executorch::runtime::internal::logf( \
_log_level, \
_timestamp, \
ET_SHORT_FILENAME, \
ET_FUNCTION, \
ET_LINE, \
_format, \
##__VA_ARGS__); \
} \
})
#else // ET_LOG_ENABLED
/**
* Log a message at the given log severity level.
*
* @param[in] _level Log severity level.
* @param[in] _format Log message format string.
*/
#define ET_LOG(_level, _format, ...) ((void)0)
#endif // ET_LOG_ENABLED