Browse Source

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.
Enrico Loparco 1 year ago
parent
commit
3fcd79867d

+ 3 - 0
build-scripts/config_common.cmake

@@ -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 ()

+ 2 - 0
core/shared/utils/bh_log.c

@@ -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;

+ 6 - 0
core/shared/utils/bh_log.h

@@ -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
 

+ 11 - 1
doc/build_wamr.md

@@ -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

+ 1 - 1
samples/basic/build.sh

@@ -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"

+ 27 - 1
samples/basic/src/main.c

@@ -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;