一个好的 开源项目,日志信息打印 是bi 不可少的 ...
tensorflowlite 中 的 log 貌似 用一个宏 来定义...
全局搜索 ... TFLITE_LOG_PROD_ONCE
然后 发现,她 存在 于
tensorflow/lite/minimal_logging.h
#define TFLITE_LOG_PROD(severity, format, ...) \
tflite::logging_internal::MinimalLogger::Log(severity, format, ##__VA_ARGS__);
// Convenience macro for logging a statement *once* for a given process lifetime
// in production builds.
#define TFLITE_LOG_PROD_ONCE(severity, format, ...) \
do { \
static const bool s_logged = [&] { \
TFLITE_LOG_PROD(severity, format, ##__VA_ARGS__) \
return true; \
}(); \
(void)s_logged; \
} while (false);
以上是 源码部分 .... 版本为 r1.14,如有更改,请勿惊讶...
可以看出 TFLITE_LOG_PROD_ONCE 这个宏定义的意思.......实际上还是调用了这个
TFLITE_LOG_PROD 宏定义...
暂时先等等 ,等下再来 分析下面这句话的意思:
tflite::logging_internal::MinimalLogger::Log(severity, format, ##__VA_ARGS__);
第一步,先看下
这个 log 函数,第一个参数,是打印等级 ...
参数是:
enum LogSeverity {
TFLITE_LOG_INFO = 0,
TFLITE_LOG_WARNING = 1,
TFLITE_LOG_ERROR = 2,
};
根据你的编译选项,选择你需要的文件,自动编译,例如,你在./configure 文件配置的时候
假如 你的是android,那么log 信息文件编译,就在
minimal_logging_android.cc
该文件 一样是位于 tensorflow/lite/下...
在该实现文件内 部 ,可以看到包含了 android的头文件 ,大约在 18 lines
看具体代码:
void MinimalLogger::LogFormatted(LogSeverity severity, const char* format,
va_list args) {
// First log to Android's explicit log(cat) API.
va_list args_for_android_log;
va_copy(args_for_android_log, args);
__android_log_vprint(GetPlatformSeverity(severity), "tflite", format, args);
va_end(args_for_android_log);
// Also print to stderr for standard console applications.
fprintf(stderr, "%s: ", GetSeverityName(severity));
vfprintf(stderr, format, args);
fputc('\n', stderr);
}
} // namespace logging_internal
}
int GetPlatformSeverity(LogSeverity severity) {
switch (severity) {
case TFLITE_LOG_INFO:
return ANDROID_LOG_INFO;
case TFLITE_LOG_WARNING:
return ANDROID_LOG_WARN;
case TFLITE_LOG_ERROR:
return ANDROID_LOG_ERROR;
default:
return ANDROID_LOG_DEBUG;
}
}
其他的, 类似...好像就是这样子了....