From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-lj1-f195.google.com (mail-lj1-f195.google.com [209.85.208.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by dev.tarantool.org (Postfix) with ESMTPS id 60AA542EF5D for ; Thu, 2 Jul 2020 12:51:21 +0300 (MSK) Received: by mail-lj1-f195.google.com with SMTP id h19so31042148ljg.13 for ; Thu, 02 Jul 2020 02:51:21 -0700 (PDT) From: Cyrill Gorcunov Date: Thu, 2 Jul 2020 12:50:53 +0300 Message-Id: <20200702095054.367131-3-gorcunov@gmail.com> In-Reply-To: <20200702095054.367131-1-gorcunov@gmail.com> References: <20200702095054.367131-1-gorcunov@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [Tarantool-patches] [PATCH v3 2/3] lua/log: allow to use json formatter early List-Id: Tarantool development patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: tml Cc: yaroslav.dynnikov@gmail.com There is no reason to not allow for json formatter on early logging stage. We add verification that box.cfg{log="syslog:", log_format="json"} or require('log').cfg{log="syslog:", format="json"} is triggering error since syslog output requires predefined structure and can't use json. Fixes #5121 Signed-off-by: Cyrill Gorcunov --- src/box/lua/load_cfg.lua | 6 +++--- src/lua/log.lua | 42 ++++++++++++++++++++++++++++++---------- 2 files changed, 35 insertions(+), 13 deletions(-) diff --git a/src/box/lua/load_cfg.lua b/src/box/lua/load_cfg.lua index f2f2df6f8..549c14cf3 100644 --- a/src/box/lua/load_cfg.lua +++ b/src/box/lua/load_cfg.lua @@ -459,13 +459,13 @@ local function prepare_cfg(cfg, default_cfg, template_cfg, module_cfg[k], modify_cfg[k], readable_name) elseif template_cfg[k] == 'module' then local old_value = module_cfg[k].cfg_get(k, v) - module_cfg_backup[k] = old_value + module_cfg_backup[k] = old_value or box.NULL - local ok, msg = module_cfg[k].cfg_set(k, v) + local ok, msg = module_cfg[k].cfg_set(cfg, k, v) if not ok then -- restore back the old values for modules for module_k, module_v in pairs(module_cfg_backup) do - module_cfg[module_k].cfg_set(module_k, module_v) + module_cfg[module_k].cfg_set(nil, module_k, module_v) end box.error(box.error.CFG, readable_name, msg) end diff --git a/src/lua/log.lua b/src/lua/log.lua index bed690526..0d427a0b7 100644 --- a/src/lua/log.lua +++ b/src/lua/log.lua @@ -194,7 +194,7 @@ local function verify_static(k, v) end -- Test if format is valid. -local function verify_format(key, name) +local function verify_format(key, name, cfg) assert(log_cfg[key] ~= nil) if not fmt_str2num[name] then @@ -202,11 +202,25 @@ local function verify_format(key, name) return false, m:format(fmt_list()) end + local log_type = ffi.C.log_type() + + -- When comes from log.cfg{} or box.cfg{} + -- initial call we might be asked to setup + -- syslog with json which is not allowed. + -- + -- Note the cfg table comes from two places: + -- box api interface and log module itself. + -- The good thing that we're only needed log + -- entry which is the same key for both. + if cfg ~= nil and cfg['log'] ~= nil then + if string.startswith(cfg['log'], "syslog:") then + log_type = ffi.C.SAY_LOGGER_SYSLOG + end + end + if fmt_str2num[name] == ffi.C.SF_JSON then - if ffi.C.log_type() == ffi.C.SAY_LOGGER_SYSLOG or - ffi.C.log_type() == ffi.C.SAY_LOGGER_BOOT then - local m = "%s can't be used with " .. - "syslog or boot-time logger" + if log_type == ffi.C.SAY_LOGGER_SYSLOG then + local m = "%s can't be used with syslog logger" return false, m:format(fmt_num2str[ffi.C.SF_JSON]) end end @@ -239,11 +253,11 @@ local verify_ops = { } -- Verify a value for the particular key. -local function verify_option(k, v) +local function verify_option(k, v, ...) assert(k ~= nil) if verify_ops[k] ~= nil then - return verify_ops[k](k, v) + return verify_ops[k](k, v, ...) end return true @@ -372,10 +386,18 @@ local function box_api_cfg_get(key) end -- Set value to log from box.cfg{}. -local function box_api_cfg_set(key, value) +local function box_api_cfg_set(cfg, key, value) local log_key = box2log_keys[key] + local aux_data + + -- a special case where we need to restore + -- nil value from previous setup attempt. + if value == box.NULL then + log_cfg[log_key] = nil + return true + end - local ok, msg = verify_option(log_key, value) + local ok, msg = verify_option(log_key, value, cfg) if not ok then return false, msg end @@ -450,7 +472,7 @@ local function load_cfg(oldcfg, cfg) end if cfg.format ~= nil then - local ok, msg = verify_option('format', cfg.format) + local ok, msg = verify_option('format', cfg.format, cfg) if not ok then local m = "log.cfg: \'%s\' %s" error(m:format('format', msg)) -- 2.26.2