summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Klishin <michael@clojurewerkz.org>2021-12-02 19:24:24 +0300
committerMichael Klishin <michael@clojurewerkz.org>2021-12-02 19:24:24 +0300
commit5cca0241078adb58f4b4bda5aaa639f303d0edd3 (patch)
treec2fa69eac00ffc297651a8673a9e394d3f70074e
parentc5033b0cefd67715d840dcf04098d99d4dba1e37 (diff)
downloadrabbitmq-server-git-5cca0241078adb58f4b4bda5aaa639f303d0edd3.tar.gz
More log rotation date spec parser improvements
Note that Lager itself doesn't handle certain combinations: * $W0H45 is fine * $W0D1H45 fails with an error but hopefully what we have now should be enough for a minimalistic built-in log rotation feature.
-rw-r--r--deps/rabbit/apps/rabbitmq_prelaunch/src/rabbit_logger_std_h.erl26
-rw-r--r--deps/rabbit/apps/rabbitmq_prelaunch/test/rabbit_logger_std_h_SUITE.erl14
2 files changed, 38 insertions, 2 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 7b556aeb9f..4b8c43904a 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
@@ -29,7 +29,7 @@
io:put_chars(DEVICE, DATA)
end).
--export([parse_date_spec/1, parse_day_of_week/2, parse_day_of_month/2, parse_hour/2]).
+-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.
@@ -610,6 +610,22 @@ parse_date_spec([$$, $D, D1 | Rest], Acc0) when D1 >= $0, D1 =< $9 ->
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 => day, 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#{hour => 0}),
+ parse_date_spec(Rest, Acc);
+%% $H0
+parse_date_spec([$$, $H, H1 | Rest], Acc0) when H1 >= $0, H1 =< $9 ->
+ Acc = parse_minute([H1], Acc0#{every => day, hour => 0}),
+ parse_date_spec(Rest, Acc);
+%% H0
+parse_date_spec([$H, H1 | Rest], Acc0) when H1 >= $0, H1 =< $9 ->
+ Acc = parse_minute([H1], Acc0#{hour => 0}),
+ 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}),
@@ -626,6 +642,14 @@ parse_date_spec(Input, error) ->
io:format(standard_error, "Failed to parse rotation date spec: ~p (error)~n", [Input]),
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_hour("", Acc) ->
Acc;
parse_hour(Input, Acc) ->
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 05a439ede7..0ffac70f65 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
@@ -21,7 +21,8 @@ groups() ->
parse_date_spec_case2,
parse_date_spec_case3,
parse_date_spec_case4,
- parse_date_spec_case5
+ parse_date_spec_case5,
+ parse_date_spec_case6
]}
].
@@ -250,3 +251,14 @@ parse_date_spec_case5(_) ->
?assertEqual(
error,
rabbit_logger_std_h:parse_date_spec("$D99")).
+
+parse_date_spec_case6(_) ->
+ ?assertEqual(
+ #{every => day, hour => 0, minute => 30},
+ rabbit_logger_std_h:parse_date_spec("$H30")),
+ ?assertEqual(
+ #{every => day, hour => 0, 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")).