rewrite from lager
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

185 lines
7.0 KiB

4 years ago
  1. %% -------------------------------------------------------------------
  2. %%
  3. %% Copyright (c) 2016-2017 Basho Technologies, Inc.
  4. %%
  5. %% This file is provided to you under the Apache License,
  6. %% Version 2.0 (the "License"); you may not use this file
  7. %% except in compliance with the License. You may obtain
  8. %% a copy of the License at
  9. %%
  10. %% http://www.apache.org/licenses/LICENSE-2.0
  11. %%
  12. %% Unless required by applicable law or agreed to in writing,
  13. %% software distributed under the License is distributed on an
  14. %% "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  15. %% KIND, either express or implied. See the License for the
  16. %% specific language governing permissions and limitations
  17. %% under the License.
  18. %%
  19. %% -------------------------------------------------------------------
  20. -module(lager_rotate).
  21. -ifdef(TEST).
  22. -include_lib("eunit/include/eunit.hrl").
  23. -endif.
  24. -record(state, {
  25. dir :: string(),
  26. log1 :: string(),
  27. log1r :: string(),
  28. log2 :: string(),
  29. log2r :: string(),
  30. sink :: string(),
  31. sinkr :: string()
  32. }).
  33. rotate_test_() ->
  34. {foreach,
  35. fun() ->
  36. {ok, Dir} = lager_util:create_test_dir(),
  37. Log1 = filename:join(Dir, "test1.log"),
  38. Log2 = filename:join(Dir, "test2.log"),
  39. Sink = filename:join(Dir, "sink.log"),
  40. State = #state{
  41. dir = Dir,
  42. log1 = Log1,
  43. log1r = Log1 ++ ".0",
  44. log2 = Log2,
  45. log2r = Log2 ++ ".0",
  46. sink = Sink,
  47. sinkr = Sink ++ ".0"
  48. },
  49. file:write_file(Log1, []),
  50. file:write_file(Log2, []),
  51. file:write_file(Sink, []),
  52. error_logger:tty(false),
  53. application:load(lager),
  54. application:set_env(lager, handlers, [
  55. {lager_file_backend, [{file, Log1}, {level, info}]},
  56. {lager_file_backend, [{file, Log2}, {level, info}]} ]),
  57. application:set_env(lager, extra_sinks, [
  58. {sink_event,
  59. [{handlers,
  60. [{lager_file_backend, [{file, Sink}, {level, info}]}]}
  61. ]}]),
  62. application:set_env(lager, error_logger_redirect, false),
  63. application:set_env(lager, async_threshold, undefined),
  64. lager:start(),
  65. timer:sleep(1000),
  66. State
  67. end,
  68. fun(#state{}) ->
  69. ok = application:stop(lager),
  70. ok = application:stop(goldrush),
  71. ok = lager_util:delete_test_dir(),
  72. ok = error_logger:tty(true)
  73. end, [
  74. fun(State) ->
  75. {"Rotate single file",
  76. fun() ->
  77. lager:log(error, self(), "Test message 1"),
  78. lager:log(sink_event, error, self(), "Sink test message 1", []),
  79. lager:rotate_handler({lager_file_backend, State#state.log1}),
  80. ok = wait_until(fun() -> filelib:is_regular(State#state.log1r) end, 10),
  81. lager:log(error, self(), "Test message 2"),
  82. lager:log(sink_event, error, self(), "Sink test message 2", []),
  83. {ok, File1} = file:read_file(State#state.log1),
  84. {ok, File2} = file:read_file(State#state.log2),
  85. {ok, SinkFile} = file:read_file(State#state.sink),
  86. {ok, File1Old} = file:read_file(State#state.log1r),
  87. have_no_log(File1, <<"Test message 1">>),
  88. have_log(File1, <<"Test message 2">>),
  89. have_log(File2, <<"Test message 1">>),
  90. have_log(File2, <<"Test message 2">>),
  91. have_log(File1Old, <<"Test message 1">>),
  92. have_no_log(File1Old, <<"Test message 2">>),
  93. have_log(SinkFile, <<"Sink test message 1">>),
  94. have_log(SinkFile, <<"Sink test message 2">>)
  95. end}
  96. end,
  97. fun(State) ->
  98. {"Rotate sink",
  99. fun() ->
  100. lager:log(error, self(), "Test message 1"),
  101. lager:log(sink_event, error, self(), "Sink test message 1", []),
  102. lager:rotate_sink(sink_event),
  103. ok = wait_until(fun() -> filelib:is_regular(State#state.sinkr) end, 10),
  104. lager:log(error, self(), "Test message 2"),
  105. lager:log(sink_event, error, self(), "Sink test message 2", []),
  106. {ok, File1} = file:read_file(State#state.log1),
  107. {ok, File2} = file:read_file(State#state.log2),
  108. {ok, SinkFile} = file:read_file(State#state.sink),
  109. {ok, SinkFileOld} = file:read_file(State#state.sinkr),
  110. have_log(File1, <<"Test message 1">>),
  111. have_log(File1, <<"Test message 2">>),
  112. have_log(File2, <<"Test message 1">>),
  113. have_log(File2, <<"Test message 2">>),
  114. have_log(SinkFileOld, <<"Sink test message 1">>),
  115. have_no_log(SinkFileOld, <<"Sink test message 2">>),
  116. have_no_log(SinkFile, <<"Sink test message 1">>),
  117. have_log(SinkFile, <<"Sink test message 2">>)
  118. end}
  119. end,
  120. fun(State) ->
  121. {"Rotate all",
  122. fun() ->
  123. lager:log(error, self(), "Test message 1"),
  124. lager:log(sink_event, error, self(), "Sink test message 1", []),
  125. lager:rotate_all(),
  126. ok = wait_until(fun() -> filelib:is_regular(State#state.sinkr) end, 10),
  127. lager:log(error, self(), "Test message 2"),
  128. lager:log(sink_event, error, self(), "Sink test message 2", []),
  129. {ok, File1} = file:read_file(State#state.log1),
  130. {ok, File2} = file:read_file(State#state.log2),
  131. {ok, SinkFile} = file:read_file(State#state.sink),
  132. {ok, File1Old} = file:read_file(State#state.log1r),
  133. {ok, File2Old} = file:read_file(State#state.log2r),
  134. {ok, SinkFileOld} = file:read_file(State#state.sinkr),
  135. have_no_log(File1, <<"Test message 1">>),
  136. have_log(File1, <<"Test message 2">>),
  137. have_no_log(File2, <<"Test message 1">>),
  138. have_log(File2, <<"Test message 2">>),
  139. have_no_log(SinkFile, <<"Sink test message 1">>),
  140. have_log(SinkFile, <<"Sink test message 2">>),
  141. have_log(SinkFileOld, <<"Sink test message 1">>),
  142. have_no_log(SinkFileOld, <<"Sink test message 2">>),
  143. have_log(File1Old, <<"Test message 1">>),
  144. have_no_log(File1Old, <<"Test message 2">>),
  145. have_log(File2Old, <<"Test message 1">>),
  146. have_no_log(File2Old, <<"Test message 2">>)
  147. end}
  148. end
  149. ]}.
  150. have_log(Data, Log) ->
  151. {_,_} = binary:match(Data, Log).
  152. have_no_log(Data, Log) ->
  153. nomatch = binary:match(Data, Log).
  154. wait_until(_Fun, 0) -> {error, too_many_retries};
  155. wait_until(Fun, Retry) ->
  156. case Fun() of
  157. true -> ok;
  158. false ->
  159. timer:sleep(500),
  160. wait_until(Fun, Retry-1)
  161. end.