From 6fca75e5fba5f492fc198f65f8f7ccb7b81ceeb2 Mon Sep 17 00:00:00 2001 From: SisMaker <1713699517@qq.com> Date: Fri, 5 Mar 2021 13:15:44 +0800 Subject: [PATCH] =?UTF-8?q?ft:=20=E4=BB=A3=E7=A0=81=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/eRum.hrl | 7 ++-- src/eRum.erl | 3 +- src/eRum_app.erl | 83 +++++++++++++++++++----------------------------- 3 files changed, 36 insertions(+), 57 deletions(-) diff --git a/include/eRum.hrl b/include/eRum.hrl index a352eaa..53f0910 100644 --- a/include/eRum.hrl +++ b/include/eRum.hrl @@ -11,7 +11,6 @@ -define(RumErrLogSink, error_logger_lager_event). %% 进程字典Key --define(RumPdLogNames, rumPdLogNames). -define(RumBackendThrottle, rumBackendThrottle). @@ -19,9 +18,9 @@ %% 默认日志文件选项 -define(RumDefHandler, [ - {lager_console_backend, [{level, info}]}, - {lager_file_backend, [{file, "error.log"}, {level, error}, {size, 10485760}, {date, "$D0"}, {count, 5}]}, - {lager_file_backend, [{file, "console.log"}, {level, info}, {size, 10485760}, {date, "$D0"}, {count, 5}]} + {rumBackendConsole, [{level, info}]}, + {rumBackendFile, [{file, "error.log"}, {level, error}, {size, 10485760}, {date, "$D0"}, {count, 5}]}, + {rumBackendFile, [{file, "console.log"}, {level, info}, {size, 10485760}, {date, "$D0"}, {count, 5}]} ]). %% 获取元数据的宏定义 diff --git a/src/eRum.erl b/src/eRum.erl index dc677bc..4b863f4 100644 --- a/src/eRum.erl +++ b/src/eRum.erl @@ -277,8 +277,7 @@ trace_file(File, Filter, Level, Options) -> {file, FileName}), {level, none}), HandlerInfo = - lager_app:start_handler(Sink, {lager_file_backend, FileName}, - LogFileConfig), + eRum_app:startHandler(Sink, {lager_file_backend, FileName}, LogFileConfig), rumConfig:global_set(handlers, [HandlerInfo | Handlers]), {ok, installed}; {_Watcher, _Handler, Sink} -> diff --git a/src/eRum_app.erl b/src/eRum_app.erl index 962447c..394a5df 100644 --- a/src/eRum_app.erl +++ b/src/eRum_app.erl @@ -9,7 +9,7 @@ , start/2 , stop/1 , doStart/1 - , start_handler/3 + , startHandler/3 , configure_sink/2 ]). @@ -32,16 +32,12 @@ boot() -> tryInstallKiller(rumUtil:get_env(killerHwm, undefined), rumUtil:get_env(killerReTime, undefined), ?RumDefSink), - start_handlers(rumUtil:get_env(handlers, ?RumDefHandler), ?RumDefSink), + tryStartHandlers(rumUtil:get_env(handlers, ?RumDefHandler), ?RumDefSink), - eRum:update_loglevel_config(?RumDefSink), - SavedHandlers = start_error_logger_handler( - application:get_env(lager, error_logger_redirect, true), - interpret_hwm(application:get_env(lager, error_logger_hwm, 0)), - application:get_env(lager, error_logger_whitelist, []) - ), + SavedHandlers = start_error_logger_handler(rumUtil:get_env(error_logger_redirect, true), rumUtil:get_env(error_logger_hwm, 0), rumUtil:get_env(error_logger_whitelist, [])), + eRum:update_loglevel_config(?RumDefSink), SavedHandlers. doStart('__traces') -> @@ -88,52 +84,37 @@ tryInstallKiller(HWM, ReTime, Sink) -> end, ok. -start_handlers(undefined, _Sink) -> ok; -start_handlers(Handlers, _Sink) when not is_list(Handlers) -> - error_logger:error_msg("Invalid value for 'handlers' (must be list): ~p~n", [Handlers]), - throw({error, bad_config}); -start_handlers(Sink, Handlers) -> - %% handlers failing to start are handled in the handler_watcher - rumConfig:global_set(handlers, - rumConfig:global_get(handlers, []) ++ - lists:map( - fun - ({Module, Config}) -> - check_handler_config(Module, Config), - start_handler(Sink, Module, Config); - (_) -> - throw({error, bad_config}) - end, - expand_handlers(Handlers))), +tryStartHandlers(undefined, _Sink) -> ok; +tryStartHandlers(Handlers, Sink) -> + %% 启动失败的处理程序将在handler_watcher中处理 + NewHandler = doStartHandlers(Handlers, Sink, [], []), + rumConfig:global_set(handlers, rumConfig:global_get(handlers, []) ++ NewHandler), ok. -start_handler(Sink, Module, Config) -> - {ok, Watcher} = supervisor:start_child(lager_handler_watcher_sup, [Sink, Module, Config]), - {Module, Watcher, Sink}. - -check_handler_config({lager_file_backend, F}, Config) when is_list(Config); is_tuple(Config) -> - Fs = - case get(?RumPdLogNames) of - undefined -> ordsets:new(); - X -> X +doStartHandlers([], _Sink, _NameAcc, HandlerAcc) -> + HandlerAcc; +doStartHandlers([OneHandler | Handlers], Sink, NameAcc, HandlerAcc) -> + {Module, Options} = expand_handlers(OneHandler), + NewNameAcc = + case Module of + {rumBackendFile, F} -> + case lists:member(F, NameAcc) of + true -> + error_logger:error_msg("Cannot have same file (~p) in multiple file backends~n", [F]), + throw({error, bad_config}); + _ -> + [F | NameAcc] + end; + _ -> + NameAcc end, - case ordsets:is_element(F, Fs) of - true -> - error_logger:error_msg( - "Cannot have same file (~p) in multiple file backends~n", [F]), - throw({error, bad_config}); - false -> - put(?RumPdLogNames, - ordsets:add_element(F, Fs)) - end, - ok; -check_handler_config(_Handler, Config) when is_list(Config) orelse is_atom(Config) -> - ok; -check_handler_config(Handler, _BadConfig) -> - throw({error, {bad_config, Handler}}). -clean_up_config_checks() -> - erase(?RumPdLogNames). + HandlerRet = startHandler(Sink, Module, Options), + doStartHandlers(Handlers, Sink, NewNameAcc, [HandlerRet | HandlerAcc]). + +startHandler(Sink, Module, Config) -> + {ok, Watcher} = supervisor:start_child(rumHWatcherSup, [Sink, Module, Config]), + {Module, Watcher, Sink}. interpret_hwm(undefined) -> undefined; @@ -210,7 +191,7 @@ configure_sink(Sink, SinkDef) -> tryStartAsyncMgr(Sink, proplists:get_value(asyncThreshold, SinkDef), proplists:get_value(asyncThresholdWindow, SinkDef)), _ = tryInstallKiller(Sink, proplists:get_value(killerHwm, SinkDef), proplists:get_value(killerReTime, SinkDef)), - start_handlers(Sink, proplists:get_value(handlers, SinkDef, [])), + tryStartHandlers(proplists:get_value(handlers, SinkDef, []), Sink), eRum:update_loglevel_config(Sink).