diff options
author | Michael Klishin <klishinm@vmware.com> | 2021-12-03 14:08:19 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-12-03 14:08:19 +0300 |
commit | 8e9d7df94dfc16fdc0a1334398313b8938efa046 (patch) | |
tree | 59ce8ffa91c3956c78c05b000b4f53601e944165 | |
parent | 08e7244827ef18d55f471fc32d9aaeba53e44d34 (diff) | |
parent | 445cfc99d1fb5457e5477f45a92ba62b8ae3c808 (diff) | |
download | rabbitmq-server-git-8e9d7df94dfc16fdc0a1334398313b8938efa046.tar.gz |
Merge pull request #3846 from rabbitmq/mergify/bp/v3.9.x/pr-3835
Extend log.file.rotation.date parser (backport #3835)
-rw-r--r-- | deps/rabbit/apps/rabbitmq_prelaunch/src/rabbit_logger_std_h.erl | 136 | ||||
-rw-r--r-- | deps/rabbit/apps/rabbitmq_prelaunch/test/rabbit_logger_std_h_SUITE.erl | 84 |
2 files changed, 168 insertions, 52 deletions
diff --git a/deps/rabbit/apps/rabbitmq_prelaunch/src/rabbit_logger_std_h.erl b/deps/rabbit/apps/rabbitmq_prelaunch/src/rabbit_logger_std_h.erl index 52ba2256dc..abb1d2ff73 100644 --- a/deps/rabbit/apps/rabbitmq_prelaunch/src/rabbit_logger_std_h.erl +++ b/deps/rabbit/apps/rabbitmq_prelaunch/src/rabbit_logger_std_h.erl @@ -19,9 +19,6 @@ %% -module(rabbit_logger_std_h). -%-include("logger.hrl"). -%-include("logger_internal.hrl"). -%-include("logger_h_common.hrl"). -ifdef(TEST). -define(io_put_chars(DEVICE, DATA), begin %% We log to Common Test log as well. @@ -31,6 +28,8 @@ ct:log("~ts", [DATA]), io:put_chars(DEVICE, DATA) end). + +-export([parse_date_spec/1, parse_day_of_week/2, parse_day_of_month/2, parse_hour/2, parse_minute/2]). -else. -define(io_put_chars(DEVICE, DATA), io:put_chars(DEVICE, DATA)). -endif. @@ -571,55 +570,122 @@ update_rotation({Size,DateSpec,Count,Compress},#{file_name:=FileName}=State) -> maybe_update_compress(0,State1), maybe_rotate_file(0,State1). +%% +%% Date spec parser +%% + +%% Some examples from Lager docs: +%% +%% $D0 rotate every night at midnight +%% $D23 rotate every day at 23:00 hr +%% $W0D23 rotate every week on Sunday at 23:00 hr +%% $W5D16 rotate every week on Friday at 16:00 hr +%% $M1D0 rotate on the first day of every month at +%% midnight (i.e., the start of the day) +%% $M5D6 rotate on every 5th day of the month at +%% 6:00 hr + parse_date_spec(false) -> false; parse_date_spec("") -> false; -parse_date_spec([$$,$D | DateSpec]) -> - io:format(standard_error, "parse_date_spec: ~p (hour)~n", [DateSpec]), - parse_hour(DateSpec, #{every=>day, - hour=>0}); -parse_date_spec([$$,$W | DateSpec]) -> - io:format(standard_error, "parse_date_spec: ~p (week)~n", [DateSpec]), - parse_day_of_week(DateSpec, #{every=>week, - hour=>0}); -parse_date_spec([$$,$M | DateSpec]) -> - io:format(standard_error, "parse_date_spec: ~p (month)~n", [DateSpec]), - parse_day_of_month(DateSpec, #{every=>month, - hour=>0}); -parse_date_spec(DateSpec) -> - io:format(standard_error, "parse_date_spec: ~p (error)~n", [DateSpec]), +parse_date_spec(Input) -> + parse_date_spec(Input, #{}). + +parse_date_spec("", Acc) -> + Acc; +%% $D23 +parse_date_spec([$$, $D, D1, D2 | Rest], Acc0) when D1 >= $0, D1 =< $9, D2 >= $0, D2 =< $9 -> + Acc = parse_hour([D1, D2], Acc0#{every => day, hour => 0}), + parse_date_spec(Rest, Acc); +%% D23 +parse_date_spec([$D, D1, D2 | Rest], Acc0) when D1 >= $0, D1 =< $9, D2 >= $0, D2 =< $9 -> + Acc = parse_hour([D1, D2], Acc0#{hour => 0}), + parse_date_spec(Rest, Acc); +%% $D0 +parse_date_spec([$$, $D, D1 | Rest], Acc0) when D1 >= $0, D1 =< $9 -> + Acc = parse_hour([D1], Acc0#{every => day, hour => 0}), + parse_date_spec(Rest, Acc); +%% D0 +parse_date_spec([$D, D1 | Rest], Acc0) when D1 >= $0, D1 =< $9 -> + Acc = parse_hour([D1], Acc0#{hour => 0}), + parse_date_spec(Rest, Acc); +%% $H23 +parse_date_spec([$$, $H, H1, H2 | Rest], Acc0) when H1 >= $0, H1 =< $9, H2 >= $0, H2 =< $9 -> + Acc = parse_minute([H1, H2], Acc0#{every => hour}), + parse_date_spec(Rest, Acc); +%% H23 +parse_date_spec([$H, H1, H2 | Rest], Acc0) when H1 >= $0, H1 =< $9, H2 >= $0, H2 =< $9 -> + Acc = parse_minute([H1, H2], Acc0), + parse_date_spec(Rest, Acc); +%% $H0 +parse_date_spec([$$, $H, H1 | Rest], Acc0) when H1 >= $0, H1 =< $9 -> + Acc = parse_minute([H1], Acc0#{every => hour}), + parse_date_spec(Rest, Acc); +%% H0 +parse_date_spec([$H, H1 | Rest], Acc0) when H1 >= $0, H1 =< $9 -> + Acc = parse_minute([H1], Acc0), + parse_date_spec(Rest, Acc); +%% $W0 +parse_date_spec([$$, $W, W | Rest], Acc0) when W >= $0, W =< $6 -> + Acc = parse_day_of_week([W], Acc0#{every => week, hour => 0}), + parse_date_spec(Rest, Acc); +%% $M0 +parse_date_spec([$$, $M, M | Rest], Acc0) when M >= $0, M =< $6 -> + Acc = parse_day_of_month([M], Acc0#{every => month, hour => 0}), + parse_date_spec(Rest, Acc); +%% all other inputs +parse_date_spec(Input, _Acc) -> + io:format(standard_error, "Failed to parse rotation date spec: ~p (error)~n", [Input]), error. -parse_hour(Rest,Result) -> - case date_string_to_int(Rest,0,23) of - {Hour,""} -> Result#{hour=>Hour}; - error -> error +parse_minute("", Acc) -> + Acc; +parse_minute(Input, Acc) -> + case string_to_int_within_range(Input, 0, 59) of + {Val, _Rest} -> Acc#{minute => Val}; + error -> error end. -parse_day_of_week(Rest,Result) -> - case date_string_to_int(Rest,0,6) of - {DayOfWeek,Rest} -> parse_hour(Rest,Result#{day_of_week=>DayOfWeek}); - error -> error +parse_hour("", Acc) -> + Acc; +parse_hour(Input, Acc) -> + case string_to_int_within_range(Input, 0, 23) of + {Val, _Rest} -> Acc#{hour => Val}; + error -> error end. -parse_day_of_month([Last | Rest],Result) +parse_day_of_week("", Acc) -> + Acc; +parse_day_of_week(Input, Acc) -> + case string_to_int_within_range(Input, 0, 6) of + {DayOfWeek, _Rest} -> Acc#{day_of_week => DayOfWeek}; + error -> error + end. + +parse_day_of_month("", Acc) -> + Acc; +parse_day_of_month([Last | _Rest], Acc) when Last=:=$l orelse Last=:=$L -> - parse_hour(Rest,Result#{day_of_month=>last}); -parse_day_of_month(Rest,Result) -> - case date_string_to_int(Rest,1,31) of - {DayOfMonth,Rest} -> parse_hour(Rest,Result#{day_of_month=>DayOfMonth}); - error -> error + Acc#{day_of_month => last}; +parse_day_of_month(Input, Acc) -> + case string_to_int_within_range(Input, 1, 31) of + {DayOfMonth, _Rest} -> Acc#{day_of_month => DayOfMonth}; + error -> error end. -date_string_to_int(String,Min,Max) -> +string_to_int_within_range(String, Min, Max) -> case string:to_integer(String) of - {Int,Rest} when is_integer(Int) andalso Int>=Min andalso Int=<Max -> - {Int,Rest}; + {Int, Rest} when is_integer(Int) andalso Int >= Min andalso Int =< Max -> + {Int, Rest}; _ -> error end. +%% +%% End of Date spec parser +%% + maybe_remove_archives(Count,#{file_name:=FileName}=State) -> Archive = rot_file_name(FileName,Count,false), CompressedArchive = rot_file_name(FileName,Count,true), @@ -713,7 +779,6 @@ is_date_based_rotation_needed(#{every:=month,day_of_month:=last,hour:=Hour}, DateA end, TargetDateTime = {TargetDate,{Hour,0,0}}, - io:format(standard_error, "TargetDateTime=~p~n", [TargetDateTime]), DateTime1<TargetDateTime andalso DateTime2>=TargetDateTime; is_date_based_rotation_needed(#{every:=month,day_of_month:=DoM,hour:=Hour}, DateTime1,{{Year2,Month2,_}=Date2,_}=DateTime2) -> @@ -731,7 +796,6 @@ is_date_based_rotation_needed(#{every:=month,day_of_month:=DoM,hour:=Hour}, DateA end, TargetDateTime = {TargetDate,{Hour,0,0}}, - io:format(standard_error, "TargetDateTime=~p~n", [TargetDateTime]), DateTime1<TargetDateTime andalso DateTime2>=TargetDateTime; is_date_based_rotation_needed(_,_,_) -> false. diff --git a/deps/rabbit/apps/rabbitmq_prelaunch/test/rabbit_logger_std_h_SUITE.erl b/deps/rabbit/apps/rabbitmq_prelaunch/test/rabbit_logger_std_h_SUITE.erl index 007776a34d..6f5b48aa6c 100644 --- a/deps/rabbit/apps/rabbitmq_prelaunch/test/rabbit_logger_std_h_SUITE.erl +++ b/deps/rabbit/apps/rabbitmq_prelaunch/test/rabbit_logger_std_h_SUITE.erl @@ -3,19 +3,7 @@ -include_lib("common_test/include/ct.hrl"). -include_lib("eunit/include/eunit.hrl"). --export([all/0, - groups/0, - init_per_suite/2, - end_per_suite/2, - init_per_group/2, - end_per_group/2, - init_per_testcase/2, - end_per_testcase/2, - - every_day_rotation_is_detected/1, - every_week_rotation_is_detected/1, - every_month_rotation_is_detected/1 - ]). +-compile(export_all). all() -> [ @@ -24,9 +12,18 @@ all() -> groups() -> [ - {parallel_tests, [parallel], [every_day_rotation_is_detected, - every_week_rotation_is_detected, - every_month_rotation_is_detected]} + {parallel_tests, [parallel], [ + every_day_rotation_is_detected, + every_week_rotation_is_detected, + every_month_rotation_is_detected, + + parse_date_spec_case1, + parse_date_spec_case2, + parse_date_spec_case3, + parse_date_spec_case4, + parse_date_spec_case5, + parse_date_spec_case6 + ]} ]. init_per_suite(_, Config) -> Config. @@ -210,3 +207,58 @@ every_month_rotation_is_detected(_) -> #{every => month, day_of_month => last, hour => 12}, {{2021, 01, 30}, {12, 00, 00}}, {{2021, 02, 01}, {12, 00, 00}})). + +parse_date_spec_case1(_) -> + ?assertEqual(false, rabbit_logger_std_h:parse_date_spec("")). + +parse_date_spec_case2(_) -> + ?assertEqual(#{every => day, hour => 0}, + rabbit_logger_std_h:parse_date_spec("$D0")), + ?assertEqual(#{every => day, hour => 16}, + rabbit_logger_std_h:parse_date_spec("$D16")), + ?assertEqual(#{every => day, hour => 23}, + rabbit_logger_std_h:parse_date_spec("$D23")). + +parse_date_spec_case3(_) -> + ?assertEqual( + #{every => week, day_of_week => 0, hour => 0}, + rabbit_logger_std_h:parse_date_spec("$W0")), + ?assertEqual( + #{every => week, day_of_week => 0, hour => 23}, + rabbit_logger_std_h:parse_date_spec("$W0D23")), + ?assertEqual( + #{every => week, day_of_week => 5, hour => 16}, + rabbit_logger_std_h:parse_date_spec("$W5D16")). + +parse_date_spec_case4(_) -> + ?assertEqual( + #{every => month, day_of_month => 1, hour => 0}, + rabbit_logger_std_h:parse_date_spec("$M1D0")), + ?assertEqual( + #{every => month, day_of_month => 5, hour => 6}, + rabbit_logger_std_h:parse_date_spec("$M5D6")). + +parse_date_spec_case5(_) -> + ?assertEqual( + error, + rabbit_logger_std_h:parse_date_spec("INVALID")), + ?assertEqual( + error, + rabbit_logger_std_h:parse_date_spec("in$valid")), + ?assertEqual( + error, + rabbit_logger_std_h:parse_date_spec("$$D0")), + ?assertEqual( + error, + rabbit_logger_std_h:parse_date_spec("$D99")). + +parse_date_spec_case6(_) -> + ?assertEqual( + #{every => hour, minute => 30}, + rabbit_logger_std_h:parse_date_spec("$H30")), + ?assertEqual( + #{every => hour, minute => 3}, + rabbit_logger_std_h:parse_date_spec("$H3")), + ?assertEqual( + #{day_of_week => 0,every => week,hour => 0, minute => 30}, + rabbit_logger_std_h:parse_date_spec("$W0H30")). |