[njs] Moving out logger from njs core.

Dmitry Volyntsev xeioex at nginx.com
Fri Dec 15 06:58:12 UTC 2023


details:   https://hg.nginx.org/njs/rev/fc1001f6801b
branches:  
changeset: 2249:fc1001f6801b
user:      Dmitry Volyntsev <xeioex at nginx.com>
date:      Thu Dec 14 22:32:02 2023 -0800
description:
Moving out logger from njs core.

Logger is not part of the JS runtime according to ECMAScript and should
be implemented by host environment.

diffstat:

 external/njs_fs_module.c     |   1 -
 external/njs_shell.c         |  70 ++++++++++++++++++++++++++++---------------
 nginx/ngx_http_js_module.c   |  11 +-----
 nginx/ngx_js.c               |  40 ++++++++++++++++++------
 nginx/ngx_js.h               |   6 ++-
 nginx/ngx_stream_js_module.c |   6 ---
 src/njs.h                    |  26 ----------------
 src/njs_builtin.c            |   9 +-----
 src/njs_vm.c                 |  25 ---------------
 9 files changed, 82 insertions(+), 112 deletions(-)

diffs (493 lines):

diff -r ad1a7ad3c715 -r fc1001f6801b external/njs_fs_module.c
--- a/external/njs_fs_module.c	Wed Dec 13 18:38:47 2023 -0800
+++ b/external/njs_fs_module.c	Thu Dec 14 22:32:02 2023 -0800
@@ -3668,7 +3668,6 @@ njs_fs_filehandle_cleanup(void *data)
     njs_filehandle_t  *fh = data;
 
     if (fh->vm != NULL && fh->fd != -1) {
-        njs_vm_warn(fh->vm, "closing file description %d on cleanup\n", fh->fd);
         (void) close(fh->fd);
     }
 }
diff -r ad1a7ad3c715 -r fc1001f6801b external/njs_shell.c
--- a/external/njs_shell.c	Wed Dec 13 18:38:47 2023 -0800
+++ b/external/njs_shell.c	Thu Dec 14 22:32:02 2023 -0800
@@ -53,6 +53,13 @@ typedef struct {
 } njs_opts_t;
 
 
+typedef enum {
+    NJS_LOG_ERROR = 4,
+    NJS_LOG_WARN = 5,
+    NJS_LOG_INFO = 7,
+} njs_log_level_t;
+
+
 typedef struct {
     size_t                  index;
     size_t                  length;
@@ -137,8 +144,9 @@ static njs_int_t njs_ext_console_time(nj
 static njs_int_t njs_ext_console_time_end(njs_vm_t *vm, njs_value_t *args,
     njs_uint_t nargs, njs_index_t unused, njs_value_t *retval);
 
-static void njs_console_log(njs_vm_t *vm, njs_external_ptr_t external,
-    njs_log_level_t level, const u_char *start, size_t length);
+static void njs_console_log(njs_log_level_t level, const char *fmt, ...);
+static void njs_console_logger(njs_log_level_t level, const u_char *start,
+    size_t length);
 
 static intptr_t njs_event_rbtree_compare(njs_rbtree_node_t *node1,
     njs_rbtree_node_t *node2);
@@ -159,7 +167,7 @@ static njs_external_t  njs_ext_console[]
             .native = njs_ext_console_log,
 #define NJS_LOG_DUMP  16
 #define NJS_LOG_MASK  15
-            .magic8 = NJS_LOG_LEVEL_INFO | NJS_LOG_DUMP,
+            .magic8 = NJS_LOG_INFO | NJS_LOG_DUMP,
         }
     },
 
@@ -171,7 +179,7 @@ static njs_external_t  njs_ext_console[]
         .enumerable = 1,
         .u.method = {
             .native = njs_ext_console_log,
-            .magic8 = NJS_LOG_LEVEL_ERROR,
+            .magic8 = NJS_LOG_ERROR,
         }
     },
 
@@ -183,7 +191,7 @@ static njs_external_t  njs_ext_console[]
         .enumerable = 1,
         .u.method = {
             .native = njs_ext_console_log,
-            .magic8 = NJS_LOG_LEVEL_INFO,
+            .magic8 = NJS_LOG_INFO,
         }
     },
 
@@ -195,7 +203,7 @@ static njs_external_t  njs_ext_console[]
         .enumerable = 1,
         .u.method = {
             .native = njs_ext_console_log,
-            .magic8 = NJS_LOG_LEVEL_INFO,
+            .magic8 = NJS_LOG_INFO,
         }
     },
 
@@ -237,7 +245,7 @@ static njs_external_t  njs_ext_console[]
         .enumerable = 1,
         .u.method = {
             .native = njs_ext_console_log,
-            .magic8 = NJS_LOG_LEVEL_WARN,
+            .magic8 = NJS_LOG_WARN,
         }
     },
 
@@ -268,11 +276,6 @@ static njs_external_t  njs_ext_262[] = {
 };
 
 
-static njs_vm_ops_t njs_console_ops = {
-    njs_console_log,
-};
-
-
 njs_module_t  njs_console_module = {
     .name = njs_str("console"),
     .preinit = NULL,
@@ -776,7 +779,6 @@ njs_create_vm(njs_opts_t *opts)
     vm_options.opcode_debug = opts->opcode_debug;
 #endif
 
-    vm_options.ops = &njs_console_ops;
     vm_options.addons = njs_console_addon_modules;
     vm_options.external = &njs_console;
     vm_options.argv = opts->argv;
@@ -1419,7 +1421,7 @@ njs_ext_console_log(njs_vm_t *vm, njs_va
             return NJS_ERROR;
         }
 
-        njs_vm_logger(vm, level, "%*s\n", msg.length, msg.start);
+        njs_console_logger(level, msg.start, msg.length);
 
         n++;
     }
@@ -1475,7 +1477,8 @@ njs_ext_console_time(njs_vm_t *vm, njs_v
         label = njs_queue_link_data(link, njs_timelabel_t, link);
 
         if (njs_strstr_eq(&name, &label->name)) {
-            njs_vm_log(vm, "Timer \"%V\" already exists.\n", &name);
+            njs_console_log(NJS_LOG_INFO, "Timer \"%V\" already exists.",
+                            &name);
             njs_value_undefined_set(retval);
             return NJS_OK;
         }
@@ -1546,7 +1549,8 @@ njs_ext_console_time_end(njs_vm_t *vm, n
 
     for ( ;; ) {
         if (link == njs_queue_tail(labels)) {
-            njs_vm_log(vm, "Timer \"%V\" doesn’t exist.\n", &name);
+            njs_console_log(NJS_LOG_INFO, "Timer \"%V\" doesn’t exist.",
+                            &name);
             njs_value_undefined_set(retval);
             return NJS_OK;
         }
@@ -1566,7 +1570,7 @@ njs_ext_console_time_end(njs_vm_t *vm, n
     ms = ns / 1000000;
     ns = ns % 1000000;
 
-    njs_vm_log(vm, "%V: %uL.%06uLms\n", &name, ms, ns);
+    njs_console_log(NJS_LOG_INFO, "%V: %uL.%06uLms", &name, ms, ns);
 
     njs_mp_free(njs_vm_memory_pool(vm), label);
 
@@ -1693,20 +1697,36 @@ njs_clear_timeout(njs_vm_t *vm, njs_valu
 
 
 static void
-njs_console_log(njs_vm_t *vm, njs_external_ptr_t external,
-    njs_log_level_t level, const u_char *start, size_t length)
+njs_console_log(njs_log_level_t level, const char *fmt, ...)
+{
+    u_char   *p;
+    va_list  args;
+    u_char   buf[2048];
+
+    va_start(args, fmt);
+    p = njs_vsprintf(buf, buf + sizeof(buf), fmt, args);
+    va_end(args);
+
+    njs_console_logger(level, buf, p - buf);
+}
+
+
+static void
+njs_console_logger(njs_log_level_t level, const u_char *start, size_t length)
 {
     switch (level) {
-    case NJS_LOG_LEVEL_INFO:
-        njs_printf("%*s", length, start);
+    case NJS_LOG_WARN:
+        njs_printf("W: ");
         break;
-    case NJS_LOG_LEVEL_WARN:
-        njs_printf("W: %*s", length, start);
+    case NJS_LOG_ERROR:
+        njs_printf("E: ");
         break;
-    case NJS_LOG_LEVEL_ERROR:
-        njs_printf("E: %*s", length, start);
+    case NJS_LOG_INFO:
         break;
     }
+
+    njs_print(start, length);
+    njs_print("\n", 1);
 }
 
 
diff -r ad1a7ad3c715 -r fc1001f6801b nginx/ngx_http_js_module.c
--- a/nginx/ngx_http_js_module.c	Wed Dec 13 18:38:47 2023 -0800
+++ b/nginx/ngx_http_js_module.c	Thu Dec 14 22:32:02 2023 -0800
@@ -839,11 +839,6 @@ static njs_external_t  ngx_http_js_ext_p
 };
 
 
-static njs_vm_ops_t ngx_http_js_ops = {
-    ngx_js_logger,
-};
-
-
 static uintptr_t ngx_http_js_uptr[] = {
     offsetof(ngx_http_request_t, connection),
     (uintptr_t) ngx_http_js_pool,
@@ -1660,8 +1655,9 @@ ngx_http_js_ext_header_out(njs_vm_t *vm,
     }
 
     if (r->header_sent && setval != NULL) {
-        njs_vm_warn(vm, "ignored setting of response header \"%V\" because"
-                        " headers were already sent", &name);
+        ngx_log_error(NGX_LOG_WARN, r->connection->log, 0,
+                      "ignored setting of response header \"%V\" because"
+                      " headers were already sent", &name);
     }
 
     for (h = headers_out; h->name.length > 0; h++) {
@@ -4509,7 +4505,6 @@ ngx_http_js_init_conf_vm(ngx_conf_t *cf,
 
     options.backtrace = 1;
     options.unhandled_rejection = NJS_VM_OPT_UNHANDLED_REJECTION_THROW;
-    options.ops = &ngx_http_js_ops;
     options.metas = &ngx_http_js_metas;
     options.addons = njs_http_js_addon_modules;
     options.argv = ngx_argv;
diff -r ad1a7ad3c715 -r fc1001f6801b nginx/ngx_js.c
--- a/nginx/ngx_js.c	Wed Dec 13 18:38:47 2023 -0800
+++ b/nginx/ngx_js.c	Thu Dec 14 22:32:02 2023 -0800
@@ -787,11 +787,10 @@ njs_int_t
 ngx_js_ext_log(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t magic, njs_value_t *retval)
 {
-    char             *p;
-    ngx_int_t        lvl;
-    njs_str_t        msg;
-    njs_uint_t       n;
-    njs_log_level_t  level;
+    char        *p;
+    ngx_int_t   lvl;
+    njs_str_t   msg;
+    njs_uint_t  n, level;
 
     p = njs_vm_external(vm, NJS_PROTO_ID_ANY, njs_argument(args, 0));
     if (p == NULL) {
@@ -799,7 +798,7 @@ ngx_js_ext_log(njs_vm_t *vm, njs_value_t
         return NJS_ERROR;
     }
 
-    level = (njs_log_level_t) magic & NGX_JS_LOG_MASK;
+    level = magic & NGX_JS_LOG_MASK;
 
     if (level == 0) {
         if (ngx_js_integer(vm, njs_arg(args, nargs, 1), &lvl) != NGX_OK) {
@@ -892,7 +891,8 @@ ngx_js_ext_console_time(njs_vm_t *vm, nj
         label = ngx_queue_data(q, ngx_js_timelabel_t, queue);
 
         if (njs_strstr_eq(&name, &label->name)) {
-            njs_vm_log(vm, "Timer \"%V\" already exists.\n", &name);
+            ngx_js_log(vm, njs_vm_external_ptr(vm), NGX_LOG_INFO,
+                       "Timer \"%V\" already exists.", &name);
             njs_value_undefined_set(retval);
             return NJS_OK;
         }
@@ -988,7 +988,8 @@ ngx_js_ext_console_time_end(njs_vm_t *vm
     ms = ns / 1000000;
     ns = ns % 1000000;
 
-    njs_vm_log(vm, "%V: %uL.%06uLms\n", &name, ms, ns);
+    ngx_js_log(vm, njs_vm_external_ptr(vm), NGX_LOG_INFO, "%V: %uL.%06uLms",
+               &name, ms, ns);
 
     njs_value_undefined_set(retval);
 
@@ -996,7 +997,8 @@ ngx_js_ext_console_time_end(njs_vm_t *vm
 
 not_found:
 
-    njs_vm_log(vm, "Timer \"%V\" doesn't exist.\n", &name);
+    ngx_js_log(vm, njs_vm_external_ptr(vm), NGX_LOG_INFO,
+               "Timer \"%V\" doesn't exist.", &name);
 
     njs_value_undefined_set(retval);
 
@@ -1152,7 +1154,23 @@ njs_clear_timeout(njs_vm_t *vm, njs_valu
 
 
 void
-ngx_js_logger(njs_vm_t *vm, njs_external_ptr_t external, njs_log_level_t level,
+ngx_js_log(njs_vm_t *vm, njs_external_ptr_t external, ngx_uint_t level,
+    const char *fmt, ...)
+{
+    u_char   *p;
+    va_list   args;
+    u_char    buf[NGX_MAX_ERROR_STR];
+
+    va_start(args, fmt);
+    p = njs_vsprintf(buf, buf + sizeof(buf), fmt, args);
+    va_end(args);
+
+    ngx_js_logger(vm, external, level, buf, p - buf);
+}
+
+
+void
+ngx_js_logger(njs_vm_t *vm, njs_external_ptr_t external, ngx_uint_t level,
     const u_char *start, size_t length)
 {
     ngx_log_t           *log;
@@ -1174,7 +1192,7 @@ ngx_js_logger(njs_vm_t *vm, njs_external
         log = ngx_cycle->log;
     }
 
-    ngx_log_error((ngx_uint_t) level, log, 0, "js: %*s", length, start);
+    ngx_log_error(level, log, 0, "js: %*s", length, start);
 
     if (external != NULL) {
         log->handler = handler;
diff -r ad1a7ad3c715 -r fc1001f6801b nginx/ngx_js.h
--- a/nginx/ngx_js.h	Wed Dec 13 18:38:47 2023 -0800
+++ b/nginx/ngx_js.h	Thu Dec 14 22:32:02 2023 -0800
@@ -192,8 +192,10 @@ ngx_int_t ngx_js_exception(njs_vm_t *vm,
 
 njs_int_t ngx_js_ext_log(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t level, njs_value_t *retval);
-void ngx_js_logger(njs_vm_t *vm, njs_external_ptr_t external,
-    njs_log_level_t level, const u_char *start, size_t length);
+void ngx_js_log(njs_vm_t *vm, njs_external_ptr_t external,
+    ngx_uint_t level, const char *fmt, ...);
+void ngx_js_logger(njs_vm_t *vm, njs_external_ptr_t external, ngx_uint_t level,
+    const u_char *start, size_t length);
 char * ngx_js_import(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
 char * ngx_js_preload_object(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
 ngx_int_t ngx_js_init_preload_vm(ngx_conf_t *cf, ngx_js_loc_conf_t *conf);
diff -r ad1a7ad3c715 -r fc1001f6801b nginx/ngx_stream_js_module.c
--- a/nginx/ngx_stream_js_module.c	Wed Dec 13 18:38:47 2023 -0800
+++ b/nginx/ngx_stream_js_module.c	Thu Dec 14 22:32:02 2023 -0800
@@ -608,11 +608,6 @@ static njs_external_t  ngx_stream_js_ext
 };
 
 
-static njs_vm_ops_t ngx_stream_js_ops = {
-    ngx_js_logger,
-};
-
-
 static uintptr_t ngx_stream_js_uptr[] = {
     offsetof(ngx_stream_session_t, connection),
     (uintptr_t) ngx_stream_js_pool,
@@ -1784,7 +1779,6 @@ ngx_stream_js_init_conf_vm(ngx_conf_t *c
 
     options.backtrace = 1;
     options.unhandled_rejection = NJS_VM_OPT_UNHANDLED_REJECTION_THROW;
-    options.ops = &ngx_stream_js_ops;
     options.metas = &ngx_stream_js_metas;
     options.addons = njs_stream_js_addon_modules;
     options.argv = ngx_argv;
diff -r ad1a7ad3c715 -r fc1001f6801b src/njs.h
--- a/src/njs.h	Wed Dec 13 18:38:47 2023 -0800
+++ b/src/njs.h	Thu Dec 14 22:32:02 2023 -0800
@@ -46,12 +46,6 @@ typedef struct {
     uint64_t                        filler[2];
 } njs_opaque_value_t;
 
-typedef enum {
-    NJS_LOG_LEVEL_ERROR = 4,
-    NJS_LOG_LEVEL_WARN = 5,
-    NJS_LOG_LEVEL_INFO = 7,
-} njs_log_level_t;
-
 /* sizeof(njs_value_t) is 16 bytes. */
 #define njs_argument(args, n)                                                 \
     (njs_value_t *) ((u_char *) args + (n) * 16)
@@ -72,13 +66,6 @@ extern const njs_value_t            njs_
     ((n < nargs) ? njs_argument(args, n)                                      \
                  : (njs_value_assign(lvalue, &njs_value_undefined), lvalue))
 
-#define njs_vm_log(vm, fmt, ...)                                              \
-    njs_vm_logger(vm, NJS_LOG_LEVEL_INFO, fmt, ##__VA_ARGS__)
-#define njs_vm_warn(vm, fmt, ...)                                             \
-    njs_vm_logger(vm, NJS_LOG_LEVEL_WARN, fmt, ##__VA_ARGS__)
-#define njs_vm_err(vm, fmt, ...)                                              \
-    njs_vm_logger(vm, NJS_LOG_LEVEL_ERROR, fmt, ##__VA_ARGS__)
-
 #define njs_vm_error(vm, fmt, ...)                                            \
     njs_vm_error2(vm, 0, fmt, ##__VA_ARGS__)
 #define njs_vm_internal_error(vm, fmt, ...)                                   \
@@ -209,13 +196,6 @@ typedef void *                      njs_
 
 typedef njs_mod_t *(*njs_module_loader_t)(njs_vm_t *vm,
     njs_external_ptr_t external, njs_str_t *name);
-typedef void (*njs_logger_t)(njs_vm_t *vm, njs_external_ptr_t external,
-    njs_log_level_t level, const u_char *start, size_t length);
-
-
-typedef struct {
-    njs_logger_t                    logger;
-} njs_vm_ops_t;
 
 
 typedef struct {
@@ -236,7 +216,6 @@ typedef struct {
 typedef struct {
     njs_external_ptr_t              external;
     njs_vm_shared_t                 *shared;
-    njs_vm_ops_t                    *ops;
     njs_vm_meta_t                   *metas;
     njs_module_t                    **addons;
     njs_str_t                       file;
@@ -246,8 +225,6 @@ typedef struct {
 
     njs_uint_t                      max_stack_size;
 
-    njs_log_level_t                 log_level;
-
 #define NJS_VM_OPT_UNHANDLED_REJECTION_IGNORE   0
 #define NJS_VM_OPT_UNHANDLED_REJECTION_THROW    1
 
@@ -476,9 +453,6 @@ NJS_EXPORT njs_int_t njs_vm_value_dump(n
 
 NJS_EXPORT void njs_vm_memory_error(njs_vm_t *vm);
 
-NJS_EXPORT void njs_vm_logger(njs_vm_t *vm, njs_log_level_t level,
-    const char *fmt, ...);
-
 NJS_EXPORT void njs_value_undefined_set(njs_value_t *value);
 NJS_EXPORT void njs_value_null_set(njs_value_t *value);
 NJS_EXPORT void njs_value_invalid_set(njs_value_t *value);
diff -r ad1a7ad3c715 -r fc1001f6801b src/njs_builtin.c
--- a/src/njs_builtin.c	Wed Dec 13 18:38:47 2023 -0800
+++ b/src/njs_builtin.c	Thu Dec 14 22:32:02 2023 -0800
@@ -1532,7 +1532,7 @@ njs_env_hash_init(njs_vm_t *vm, njs_lvlh
     uint32_t            cp;
     njs_int_t           ret;
     const u_char        *val, *entry, *s, *end;
-    njs_object_prop_t   *prop, *prev;
+    njs_object_prop_t   *prop;
     njs_string_prop_t   string;
     njs_lvlhsh_query_t  lhq;
 
@@ -1599,13 +1599,6 @@ njs_env_hash_init(njs_vm_t *vm, njs_lvlh
              * Always using the first element among the duplicates
              * and ignoring the rest.
              */
-
-            prev = lhq.value;
-
-            if (!njs_values_same(njs_prop_value(prop), njs_prop_value(prev))) {
-                njs_vm_warn(vm, "environment variable \"%V\" has more than one"
-                            " value\n", &lhq.key);
-            }
         }
     }
 
diff -r ad1a7ad3c715 -r fc1001f6801b src/njs_vm.c
--- a/src/njs_vm.c	Wed Dec 13 18:38:47 2023 -0800
+++ b/src/njs_vm.c	Thu Dec 14 22:32:02 2023 -0800
@@ -24,7 +24,6 @@ njs_vm_opt_init(njs_vm_opt_t *options)
 {
     njs_memzero(options, sizeof(njs_vm_opt_t));
 
-    options->log_level = NJS_LOG_LEVEL_INFO;
     options->max_stack_size = NJS_MAX_STACK_SIZE;
 }
 
@@ -1093,30 +1092,6 @@ njs_vm_memory_error(njs_vm_t *vm)
 }
 
 
-njs_noinline void
-njs_vm_logger(njs_vm_t *vm, njs_log_level_t level, const char *fmt, ...)
-{
-    u_char        *p;
-    va_list       args;
-    njs_logger_t  logger;
-    u_char        buf[32768];
-
-    if (vm->options.ops == NULL) {
-        return;
-    }
-
-    logger = vm->options.ops->logger;
-
-    if (logger != NULL && vm->options.log_level >= level) {
-        va_start(args, fmt);
-        p = njs_vsprintf(buf, buf + sizeof(buf), fmt, args);
-        va_end(args);
-
-        logger(vm, vm->external, level, buf, p - buf);
-    }
-}
-
-
 njs_int_t
 njs_vm_value_string(njs_vm_t *vm, njs_str_t *dst, njs_value_t *src)
 {


More information about the nginx-devel mailing list