diff --git a/priv/emqx.schema b/priv/emqx.schema index 56f393cd5..3838db31e 100644 --- a/priv/emqx.schema +++ b/priv/emqx.schema @@ -387,11 +387,16 @@ end}. {datatype, {enum, [off, file, console, both]}} ]}. -{mapping, "log.level", "kernel.logger_level", [ +{mapping, "log.level", "kernel.logger", [ {default, error}, {datatype, {enum, [debug, info, notice, warning, error, critical, alert, emergency, all]}} ]}. +{mapping, "log.primary_level", "emqx.primary_log_level", [ + {default, error}, + {datatype, {enum, [debug, info, notice, warning, error, critical, alert, emergency, all]}} +]}. + {mapping, "log.logger_sasl_compatible", "kernel.logger_sasl_compatible", [ {default, true}, {datatype, {enum, [true, false]}} @@ -427,9 +432,13 @@ end}. hidden ]}. +{translation, "emqx.primary_log_level", fun(Conf) -> + cuttlefish:conf_get("log.level", Conf) +end}. + {translation, "kernel.logger", fun(Conf) -> LogTo = cuttlefish:conf_get("log.to", Conf), - TopLogLevel = cuttlefish:conf_get("log.level", Conf), + LogLevel = cuttlefish:conf_get("log.level", Conf), Formatter = {emqx_logger_formatter, #{template => [time," [",level,"] ", @@ -452,7 +461,7 @@ end}. DefaultHandler = if LogTo =:= console orelse LogTo =:= both -> [{handler, default, logger_std_h, - #{level => TopLogLevel, + #{level => LogLevel, config => #{type => standard_io}, formatter => Formatter}}]; true -> @@ -463,7 +472,7 @@ end}. FileHandler = if LogTo =:= file orelse LogTo =:= both -> [{handler, file, logger_disk_log_h, - #{level => TopLogLevel, + #{level => LogLevel, config => FileConf(cuttlefish:conf_get("log.file", Conf)), formatter => Formatter, filesync_repeat_interval => no_repeat}}]; diff --git a/src/emqx_app.erl b/src/emqx_app.erl index 4a39e46aa..977eabc2f 100644 --- a/src/emqx_app.erl +++ b/src/emqx_app.erl @@ -25,6 +25,12 @@ %%-------------------------------------------------------------------- start(_Type, _Args) -> + %% We'd like to configure the primary logger level here, rather than set the + %% kernel config `logger_level` before starting the erlang vm. + %% This is because the latter approach an annoying debug msg will be printed out: + %% "[debug] got_unexpected_message {'EXIT',<0.1198.0>,normal}" + logger:set_primary_config(level, application:get_env(emqx, primary_log_level, error)), + print_banner(), ekka:start(), {ok, Sup} = emqx_sup:start_link(), diff --git a/src/emqx_logger.erl b/src/emqx_logger.erl index 2d850561c..79979097c 100644 --- a/src/emqx_logger.erl +++ b/src/emqx_logger.erl @@ -25,6 +25,9 @@ -export([add_metadata_peername/1, add_metadata_client_id/1]). -export([add_proc_metadata/1]). +-export([get_primary_log_level/0, set_primary_log_level/1]). +-export([get_log_handlers/0, get_log_handler/1, set_log_handler_level/2]). + debug(Msg) -> logger:debug(Msg). debug(Format, Args) -> @@ -73,4 +76,41 @@ add_proc_metadata(Meta) -> logger:set_process_metadata(Meta); OldMeta -> logger:set_process_metadata(maps:merge(OldMeta, Meta)) - end. \ No newline at end of file + end. + +get_primary_log_level() -> + #{level := Level} = logger:get_primary_config(), + Level. + +set_primary_log_level(Level) -> + logger:set_primary_config(level, Level). + +get_log_handlers() -> + lists:map(fun log_hanlder_info/1, logger:get_handler_config()). + +get_log_handler(HandlerId) -> + {ok, Conf} = logger:get_handler_config(HandlerId), + log_hanlder_info(Conf). + +set_log_handler_level(HandlerId, Level) -> + logger:set_handler_config(HandlerId, level, Level). + +%%======================== +%% Internal Functions +%%======================== +log_hanlder_info(#{id := Id, level := Level, module := logger_std_h, + config := #{type := Type}}) when Type =:= standard_io; + Type =:= standard_error -> + {Id, Level, console}; +log_hanlder_info(#{id := Id, level := Level, module := logger_std_h, + config := #{type := Type}}) -> + case Type of + {file, Filename} -> {Id, Level, Filename}; + {file, Filename, _Opts} -> {Id, Level, Filename}; + _ -> {Id, Level, unknown} + end; +log_hanlder_info(#{id := Id, level := Level, module := logger_disk_log_h, + config := #{file := Filename}}) -> + {Id, Level, Filename}; +log_hanlder_info(#{id := Id, level := Level, module := _OtherModule}) -> + {Id, Level, unknown}. \ No newline at end of file