Forward log and log level to custom bh_log callback (#3070)

Follow-up on #2907. The log level is needed in the host embedder to
better integrate with the embedder's logger.

Allow the developer to customize his bh_log callback with
`cmake -DWAMR_BH_LOG=<log_callback>`,
and update sample/basic to show the usage.
This commit is contained in:
Enrico Loparco 2024-01-24 06:05:07 +01:00 committed by GitHub
parent 1505e61704
commit 3fcd79867d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 50 additions and 3 deletions

View File

@ -338,6 +338,9 @@ endif ()
if (DEFINED WAMR_BH_VPRINTF)
add_definitions (-DBH_VPRINTF=${WAMR_BH_VPRINTF})
endif ()
if (DEFINED WAMR_BH_LOG)
add_definitions (-DBH_LOG=${WAMR_BH_LOG})
endif ()
if (WAMR_DISABLE_APP_ENTRY EQUAL 1)
message (" WAMR application entry functions excluded")
endif ()

View File

@ -17,6 +17,7 @@ bh_log_set_verbose_level(uint32 level)
log_verbose_level = level;
}
#ifndef BH_LOG
void
bh_log(LogLevel log_level, const char *file, int line, const char *fmt, ...)
{
@ -56,6 +57,7 @@ bh_log(LogLevel log_level, const char *file, int line, const char *fmt, ...)
os_printf("\n");
}
#endif
static uint32 last_time_ms = 0;
static uint32 total_time_ms = 0;

View File

@ -38,8 +38,14 @@ typedef enum {
void
bh_log_set_verbose_level(uint32 level);
#ifndef BH_LOG
void
bh_log(LogLevel log_level, const char *file, int line, const char *fmt, ...);
#else
void
BH_LOG(uint32 log_level, const char *file, int line, const char *fmt, ...);
#define bh_log BH_LOG
#endif
#ifdef BH_PLATFORM_NUTTX

View File

@ -190,7 +190,17 @@ Currently we only profile the memory consumption of module, module_instance and
> }
> ```
>
> and then use `cmake -DWAMR_BH_VPRINTF=my_vprintf ..` to pass the callback function, or add `BH_VPRINTF=my_vprintf` macro for the compiler, e.g. add line `add_defintions(-DBH_VPRINTF=my_vprintf)` in CMakeListst.txt.
> and then use `cmake -DWAMR_BH_VPRINTF=my_vprintf ..` to pass the callback function, or add `BH_VPRINTF=my_vprintf` macro for the compiler, e.g. add line `add_defintions(-DBH_VPRINTF=my_vprintf)` in CMakeListst.txt. See [basic sample](../samples/basic/src/main.c) for a usage example.
#### **WAMR_BH_LOG**=<log_callback>, default to disable if not set
> Note: if the log_callback function is provided by the developer, WAMR logs are redirected to such callback. For example:
> ```C
> void my_log(uint32 log_level, const char *file, int line, const char *fmt, ...)
> {
> /* Usage of custom logger */
> }
> ```
> See [basic sample](../samples/basic/src/main.c) for a usage example.
#### **Enable reference types feature**
- **WAMR_BUILD_REF_TYPES**=1/0, default to disable if not set

View File

@ -21,7 +21,7 @@ echo "#####################build basic project"
cd ${CURR_DIR}
mkdir -p cmake_build
cd cmake_build
cmake .. -DCMAKE_BUILD_TYPE=Debug
cmake .. -DCMAKE_BUILD_TYPE=Debug -DWAMR_BH_VPRINTF=my_vprintf -DWAMR_BH_LOG=my_log
make -j ${nproc}
if [ $? != 0 ];then
echo "BUILD_FAIL basic exit as $?\n"

View File

@ -15,6 +15,30 @@ get_pow(int x, int y);
int32_t
calculate_native(int32_t n, int32_t func1, int32_t func2);
void
my_log(uint32 log_level, const char *file, int line, const char *fmt, ...)
{
char buf[200];
snprintf(buf, 200,
log_level == WASM_LOG_LEVEL_VERBOSE ? "[WamrLogger - VERBOSE] %s"
: "[WamrLogger] %s",
fmt);
va_list ap;
va_start(ap, fmt);
vprintf(buf, ap);
va_end(ap);
}
int
my_vprintf(const char *format, va_list ap)
{
/* Print in blue */
char buf[200];
snprintf(buf, 200, "\x1b[34m%s\x1b[0m", format);
return vprintf(buf, ap);
}
void
print_usage(void)
{
@ -95,6 +119,7 @@ main(int argc, char *argv_main[])
printf("Init runtime environment failed.\n");
return -1;
}
wasm_runtime_set_log_level(WASM_LOG_LEVEL_VERBOSE);
buffer = bh_read_file_to_buffer(wasm_path, &buf_size);
@ -103,7 +128,8 @@ main(int argc, char *argv_main[])
goto fail;
}
module = wasm_runtime_load(buffer, buf_size, error_buf, sizeof(error_buf));
module = wasm_runtime_load((uint8 *)buffer, buf_size, error_buf,
sizeof(error_buf));
if (!module) {
printf("Load wasm module failed. error: %s\n", error_buf);
goto fail;