diff --git a/README.md b/README.md index ebd4028..f42c632 100644 --- a/README.md +++ b/README.md @@ -109,22 +109,21 @@ below). If async values are not configured, no overload protection will be appli ```erlang [{eRum, [ - {logRoot, "/tmp"}, - %% Default handlers for lager/lager_event - {handlers, [ - {lager_console_backend, [{level, info}]}, - {lager_file_backend, [{file, "error.log"}, {level, error}]}, - {lager_file_backend, [{file, "console.log"}, {level, info}]} - ]}, - - %% Any other sinks - {extraSinks, [ - {audit_lager_event, - [{handlers, [{lager_file_backend, [{file, "sink1.log"}, {level, info}]}]}, - {asyncThreshold, 500}, - {asyncThrWindow, 50}] - }]} - ]}]. +{logRoot, "/tmp"}, +%% Default handlers for lager/lager_event +{handlers, [ +{lager_console_backend, [{level, info}]}, +{lager_file_backend, [{file, "error.log"}, {level, error}]}, +{lager_file_backend, [{file, "console.log"}, {level, info}]} +]}, + +%% Any other sinks +{extraSinks, [ +{audit_lager_event,[{handlers, [{lager_file_backend, [{file, "sink1.log"}, {level, info}]}]}, {asyncThreshold, 500}, {asyncThrWindow, 50}]} + +]} + +]}]. ``` 自定义格式 diff --git a/eRum.sample.config b/eRum.sample.config index 531cea5..a19d213 100644 --- a/eRum.sample.config +++ b/eRum.sample.config @@ -15,9 +15,13 @@ {emergency, <<"\e[1;41m">>} ]}, - %% ******************************************** format相关 ****************************************************** - {metadataWhitelist, []}, - {rPrettyStrace, true}, + %%*********************************************** handler与接收器(sink) and traces ****************************** + %% 消息处理模块可以存在多个,[{Name, [Optins]}]=Handler() {lager_file_backend, [{file, "console.log"}, {level, info}]} 消息处理模块可以存在多个 + {handlers, []}, + %% 额外的接收器列表 [{handler, [Handler()]}] + {extraSinks, []}, + %% traces列表 [{handler, [Handler()]}] + {traces, []}, %%*********************************************** 异步日志相关 ***************************************************** %% 异步切换到同步时模式gen_emm邮箱的最大消息数,此值仅应用于默认接收器; 额外的接收器也可以自己配置。 @@ -27,13 +31,18 @@ %% 此值仅适用于默认接收器。额外的接收器需要选项中配置。 {asyncThrWindow, undefined}, - %%*********************************************** handler与接收器(sink) and traces ****************************** - %% 消息处理模块可以存在多个,[{Name, [Optins]}]=Handler() {lager_file_backend, [{file, "console.log"}, {level, info}]} 消息处理模块可以存在多个 - {handlers, []}, - %% 额外的接收器列表 [{handler, [Handler()]}] - {extraSinks, []}, - %% traces列表 [{handler, [Handler()]}] - {traces, []}, + %% ********************************************** killer相关 **************************************************** + %% 如果接收器的邮箱大小超过1000条消息,请杀死整个接收器并在5000毫秒后重新加载它。如果需要,此行为也可以安装到其他接收器中。 + {killerHwm, 1000}, + %% 参见killer_hwm + {killerReTime, 5000}, + + + %% ******************************************** format相关 ****************************************************** + %% 元数据名单列表 + {metadataWhitelist, []}, + %% 是否美化堆栈 + {rPrettyStrace, true}, %% ********************************************** 日志文件配置相关 ************************************************ %% 可选的日志路径, 默认情况下是当前路径 @@ -54,6 +63,7 @@ %% 崩溃日志旋转器模块-默认为lager_rotator_default {crashLogRotator, rumRotatorIns}, + %% ********************************************** error_logger相关 ********************************************** %% 是否将error_logger消息重定向到默认的lager_event接收器-默认为true {errLoggerRedirect, true}, @@ -63,24 +73,18 @@ {errLoggerHwm, undefined}, %% errLogger group leader策略 handle | ignore | mirror {errLoggerGLS, handle}, + %%是否禁止 disable reformatting for OTP and Cowboy messages {errLoggerFormatRaw, false}, - %% 超过高水位标记时,可以将啤酒配置为刷新消息队列中的所有事件通知 {errLoggerFlushQueue, true}, %% 如果flush_queue为true,则可以设置消息队列长度阈值,在该阈值处将开始丢弃消息。默认阈值为0,这意味着如果flush_queue为true, - %% 则超过高水位标记时将丢弃消息,而不管消息队列的长度如何。用于控制阈值的选项是error_logger: + %% 则超过高水位标记时将丢弃消息,而不管消息队列的长度如何。 {errLoggerFlushThr, 20}, - %% ********************************************** killer相关 **************************************************** - %% 如果接收器的邮箱大小超过1000条消息,请杀死整个接收器并在5000毫秒后重新加载它。如果需要,此行为也可以安装到其他水槽中。 - {killerHwm, 1000}, - %% 参见killer_hwm - {killerReTime, 5000}, - %% ********************************************** app启动停止监听相关 ********************************************* - %% 如果您不想在应用程序的调试级别看到主管和应用程序启动/停止日志,则可以使用以下配置将其关闭: - {suppressAppStartStop, true}, - {suppressSupStartStop, true} + %% 是否不在应用程序的调试级别看到主管和应用程序启动/停止日志 + {suppressAppStartStop, false}, + {suppressSupStartStop, false} ]} ]. diff --git a/src/errLogger/rumErrLoggerH.erl b/src/errLogger/rumErrLoggerH.erl index 795bd5c..d5a278a 100644 --- a/src/errLogger/rumErrLoggerH.erl +++ b/src/errLogger/rumErrLoggerH.erl @@ -66,7 +66,7 @@ setHighWater(N) -> -spec init(any()) -> {ok, #state{}}. init([HighWaterMark, GlStrategy]) -> Flush = rumUtil:get_env(errLoggerFlushQueue, true), - FlushThr = rumUtil:get_env(errLoggerFlushThr, 0), + FlushThr = rumUtil:get_env(errLoggerFlushThr, 20), Shaper = #rumShaper{hwm = HighWaterMark, flushQueue = Flush, flushThr = FlushThr, filter = shaperFun(), id = ?MODULE}, Raw = rumUtil:get_env(errLoggerFormatRaw, false), Sink = configSink(), @@ -335,8 +335,7 @@ logEvent(Event, #state{sink = Sink, raw = FormatRaw} = State) -> no_log; _ -> {Md, Formatted} = formatReasonMd(Reason), - ?LOGFMT(Sink, info, [{pid, Pid} | Md], "Application ~w exited with reason: ~s", - [App, Formatted]) + ?LOGFMT(Sink, info, [{pid, Pid} | Md], "Application ~w exited with reason: ~s", [App, Formatted]) end; _ -> ?LOGMSG(Sink, info, Pid, printSillyList(D)) @@ -351,8 +350,7 @@ logEvent(Event, #state{sink = Sink, raw = FormatRaw} = State) -> true -> no_log; _ -> - ?LOGFMT(Sink, info, P, "Application ~w started on node ~w", - [App, Node]) + ?LOGFMT(Sink, info, P, "Application ~w started on node ~w", [App, Node]) end; [{started, Started}, {supervisor, Name}] -> case rumUtil:get_env(suppressSupStartStop, false) of diff --git a/src/utils/rumUtil.erl b/src/utils/rumUtil.erl index 6d5dec8..140676b 100644 --- a/src/utils/rumUtil.erl +++ b/src/utils/rumUtil.erl @@ -527,7 +527,7 @@ checkHwm(Shaper = #rumShaper{filter = Filter}, Event) -> end. %% 日志速率限制S i.e. 即传入消息的高水位标记 -checkHwm(#rumShaper{id = Id, hwm = Hwm, mps = Mps, lastTime = LastTime, dropped = Drop, flushQueue = FlushQueue, flushThr = FlushThreshold, timer = Timer, filter = Filter} = Shaper) -> +checkHwm(#rumShaper{id = Id, hwm = Hwm, mps = Mps, lastTime = LastTime, dropped = Drop, flushQueue = FlushQueue, flushThr = FlushThr, timer = Timer, filter = Filter} = Shaper) -> if Hwm == undefined -> {true, 0, Shaper}; @@ -548,7 +548,7 @@ checkHwm(#rumShaper{id = Id, hwm = Hwm, mps = Mps, lastTime = LastTime, dropped case LastTime == NowTime of true -> %% still in same second, but have exceeded the high water mark - NewDrops = ?IIF(isNeedFlush(FlushQueue, FlushThreshold), dropMsg(NowTime, Filter, 0), 0), + NewDrops = ?IIF(isNeedFlush(FlushQueue, FlushThr), dropMsg(NowTime, Filter, 0), 0), NewTimer = ?IIF(erlang:read_timer(Timer) =/= false, Timer, erlang:send_after(1000 - PastMs, self(), {mShaperExpired, Id})), {false, 0, Shaper#rumShaper{dropped = Drop + NewDrops + 1, timer = NewTimer}}; _ ->