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.

187 lines
7.0 KiB

  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. -compile(export_all).
  22. -ifdef(TEST).
  23. -include_lib("eunit/include/eunit.hrl").
  24. -endif.
  25. -record(state, {
  26. dir :: string(),
  27. log1 :: string(),
  28. log1r :: string(),
  29. log2 :: string(),
  30. log2r :: string(),
  31. sink :: string(),
  32. sinkr :: string()
  33. }).
  34. rotate_test_() ->
  35. {foreach,
  36. fun() ->
  37. Dir = lager_util:create_test_dir(),
  38. Log1 = filename:join(Dir, "test1.log"),
  39. Log2 = filename:join(Dir, "test2.log"),
  40. Sink = filename:join(Dir, "sink.log"),
  41. State = #state{
  42. dir = Dir,
  43. log1 = Log1,
  44. log1r = Log1 ++ ".0",
  45. log2 = Log2,
  46. log2r = Log2 ++ ".0",
  47. sink = Sink,
  48. sinkr = Sink ++ ".0"
  49. },
  50. file:write_file(Log1, []),
  51. file:write_file(Log2, []),
  52. file:write_file(Sink, []),
  53. error_logger:tty(false),
  54. application:load(lager),
  55. application:set_env(lager, handlers, [
  56. {lager_file_backend, [{file, Log1}, {level, info}]},
  57. {lager_file_backend, [{file, Log2}, {level, info}]} ]),
  58. application:set_env(lager, extra_sinks, [
  59. {sink_event,
  60. [{handlers,
  61. [{lager_file_backend, [{file, Sink}, {level, info}]}]}
  62. ]}]),
  63. application:set_env(lager, error_logger_redirect, false),
  64. application:set_env(lager, async_threshold, undefined),
  65. lager:start(),
  66. timer:sleep(1000),
  67. State
  68. end,
  69. fun(#state{dir = Dir}) ->
  70. application:stop(lager),
  71. application:stop(goldrush),
  72. lager_util:delete_test_dir(Dir),
  73. error_logger:tty(true)
  74. end, [
  75. fun(State) ->
  76. {"Rotate single file",
  77. fun() ->
  78. lager:log(error, self(), "Test message 1"),
  79. lager:log(sink_event, error, self(), "Sink test message 1", []),
  80. lager:rotate_handler({lager_file_backend, State#state.log1}),
  81. ok = wait_until(fun() -> filelib:is_regular(State#state.log1r) end, 10),
  82. lager:log(error, self(), "Test message 2"),
  83. lager:log(sink_event, error, self(), "Sink test message 2", []),
  84. {ok, File1} = file:read_file(State#state.log1),
  85. {ok, File2} = file:read_file(State#state.log2),
  86. {ok, SinkFile} = file:read_file(State#state.sink),
  87. {ok, File1Old} = file:read_file(State#state.log1r),
  88. have_no_log(File1, <<"Test message 1">>),
  89. have_log(File1, <<"Test message 2">>),
  90. have_log(File2, <<"Test message 1">>),
  91. have_log(File2, <<"Test message 2">>),
  92. have_log(File1Old, <<"Test message 1">>),
  93. have_no_log(File1Old, <<"Test message 2">>),
  94. have_log(SinkFile, <<"Sink test message 1">>),
  95. have_log(SinkFile, <<"Sink test message 2">>)
  96. end}
  97. end,
  98. fun(State) ->
  99. {"Rotate sink",
  100. fun() ->
  101. lager:log(error, self(), "Test message 1"),
  102. lager:log(sink_event, error, self(), "Sink test message 1", []),
  103. lager:rotate_sink(sink_event),
  104. ok = wait_until(fun() -> filelib:is_regular(State#state.sinkr) end, 10),
  105. lager:log(error, self(), "Test message 2"),
  106. lager:log(sink_event, error, self(), "Sink test message 2", []),
  107. {ok, File1} = file:read_file(State#state.log1),
  108. {ok, File2} = file:read_file(State#state.log2),
  109. {ok, SinkFile} = file:read_file(State#state.sink),
  110. {ok, SinkFileOld} = file:read_file(State#state.sinkr),
  111. have_log(File1, <<"Test message 1">>),
  112. have_log(File1, <<"Test message 2">>),
  113. have_log(File2, <<"Test message 1">>),
  114. have_log(File2, <<"Test message 2">>),
  115. have_log(SinkFileOld, <<"Sink test message 1">>),
  116. have_no_log(SinkFileOld, <<"Sink test message 2">>),
  117. have_no_log(SinkFile, <<"Sink test message 1">>),
  118. have_log(SinkFile, <<"Sink test message 2">>)
  119. end}
  120. end,
  121. fun(State) ->
  122. {"Rotate all",
  123. fun() ->
  124. lager:log(error, self(), "Test message 1"),
  125. lager:log(sink_event, error, self(), "Sink test message 1", []),
  126. lager:rotate_all(),
  127. ok = wait_until(fun() -> filelib:is_regular(State#state.sinkr) end, 10),
  128. lager:log(error, self(), "Test message 2"),
  129. lager:log(sink_event, error, self(), "Sink test message 2", []),
  130. {ok, File1} = file:read_file(State#state.log1),
  131. {ok, File2} = file:read_file(State#state.log2),
  132. {ok, SinkFile} = file:read_file(State#state.sink),
  133. {ok, File1Old} = file:read_file(State#state.log1r),
  134. {ok, File2Old} = file:read_file(State#state.log2r),
  135. {ok, SinkFileOld} = file:read_file(State#state.sinkr),
  136. have_no_log(File1, <<"Test message 1">>),
  137. have_log(File1, <<"Test message 2">>),
  138. have_no_log(File2, <<"Test message 1">>),
  139. have_log(File2, <<"Test message 2">>),
  140. have_no_log(SinkFile, <<"Sink test message 1">>),
  141. have_log(SinkFile, <<"Sink test message 2">>),
  142. have_log(SinkFileOld, <<"Sink test message 1">>),
  143. have_no_log(SinkFileOld, <<"Sink test message 2">>),
  144. have_log(File1Old, <<"Test message 1">>),
  145. have_no_log(File1Old, <<"Test message 2">>),
  146. have_log(File2Old, <<"Test message 1">>),
  147. have_no_log(File2Old, <<"Test message 2">>)
  148. end}
  149. end
  150. ]}.
  151. have_log(Data, Log) ->
  152. {_,_} = binary:match(Data, Log).
  153. have_no_log(Data, Log) ->
  154. nomatch = binary:match(Data, Log).
  155. wait_until(_Fun, 0) -> {error, too_many_retries};
  156. wait_until(Fun, Retry) ->
  157. case Fun() of
  158. true -> ok;
  159. false ->
  160. timer:sleep(500),
  161. wait_until(Fun, Retry-1)
  162. end.