From: Oleg Babin <olegrok@tarantool.org>
To: Cyrill Gorcunov <gorcunov@gmail.com>,
tml <tarantool-patches@dev.tarantool.org>
Cc: yaroslav.dynnikov@gmail.com
Subject: Re: [Tarantool-patches] [PATCH 2/3] lua/log: allow to use json formatter early
Date: Wed, 1 Jul 2020 13:01:43 +0300 [thread overview]
Message-ID: <e1469b31-ac42-8a34-35bb-130c36276b00@tarantool.org> (raw)
In-Reply-To: <20200630160209.279470-3-gorcunov@gmail.com>
Hi! Thanks for your patch see my four comments below.
On 30/06/2020 19:02, Cyrill Gorcunov wrote:
> 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<gorcunov@gmail.com>
> ---
May be it's not directly related to the patch but:
```
tarantool> log.cfg{log = ' syslog:identity=test', format = 'json'}
IllegalParams: expecting a file name or a prefix, such as '|', 'pipe:',
'syslog:'
failed to initialize logging subsystem
```
It should be a simple error but not panic. I've just add a space in log
parameter.
At the same time:
```
tarantool> box.cfg{log = ' syslog:'}
---
- error: 'Incorrect value for option ''log'': expecting a file name or a
prefix, such
as ''|'', ''pipe:'', ''syslog:'''
...
```
> src/box/lua/load_cfg.lua | 6 +++---
> src/lua/log.lua | 43 ++++++++++++++++++++++++++++++----------
> 2 files changed, 36 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
>
Could you please clarify this change? I see below you check "value ==
box.NULL" but if value is simple nil then such condition is true.
```
tarantool> box.NULL == nil
---
- true
...
tarantool> box.NULL == box.NULL
---
- true
...
```
Why is simple "nil" not enough?
> - 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..44414bbd7 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, init_str)
> assert(log_cfg[key] ~= nil)
>
> if not fmt_str2num[name] then
> @@ -202,11 +202,20 @@ 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.
> + if init_str ~= nil then
> + if string.sub(init_str, 1, 7) == "syslog:" then
> + log_type = ffi.C.SAY_LOGGER_SYSLOG
> + end
> + end
> +
I believe that string.startswith(str, 'syslog:') is better here than
string.sub(...).
> 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 +248,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 +381,24 @@ 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
> +
> + -- 'format' option requires auxilary data
> + -- for verification sake.
> + if cfg ~= nil and log_key == 'format' then
> + aux_data = cfg['log']
> + end
>
May be it's better to pass the whole "cfg" not single parameter to
verify_ functions. I think it's more extendable.
Feel free to disagree with me, but I think that verify_format should
extract "log" from configuration and consider them - it should not be
done on top level.
> - local ok, msg = verify_option(log_key, value)
> + local ok, msg = verify_option(log_key, value, aux_data)
> if not ok then
> return false, msg
> end
> @@ -450,7 +473,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.log)
> if not ok then
> local m = "log.cfg: \'%s\' %s"
> error(m:format('format', msg))
next prev parent reply other threads:[~2020-07-01 10:01 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-06-30 16:02 [Tarantool-patches] [PATCH v2 0/3] log: allow json formatter in boottime logger Cyrill Gorcunov
2020-06-30 16:02 ` [Tarantool-patches] [PATCH 1/3] core/say: allow to use json in boot logger Cyrill Gorcunov
2020-06-30 16:02 ` [Tarantool-patches] [PATCH 2/3] lua/log: allow to use json formatter early Cyrill Gorcunov
2020-07-01 10:01 ` Oleg Babin [this message]
2020-07-02 7:27 ` Cyrill Gorcunov
2020-07-02 7:35 ` Oleg Babin
2020-06-30 16:02 ` [Tarantool-patches] [PATCH 3/3] test: app-tap/logger -- test json in boottime logger Cyrill Gorcunov
-- strict thread matches above, loose matches on Subject: below --
2020-06-29 11:23 [Tarantool-patches] [PATCH 0/3] log: allow json formatter " Cyrill Gorcunov
2020-06-29 11:23 ` [Tarantool-patches] [PATCH 2/3] lua/log: allow to use json formatter early Cyrill Gorcunov
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=e1469b31-ac42-8a34-35bb-130c36276b00@tarantool.org \
--to=olegrok@tarantool.org \
--cc=gorcunov@gmail.com \
--cc=tarantool-patches@dev.tarantool.org \
--cc=yaroslav.dynnikov@gmail.com \
--subject='Re: [Tarantool-patches] [PATCH 2/3] lua/log: allow to use json formatter early' \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox