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.

186 rivejä
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. State
  67. end,
  68. fun(#state{dir = Dir}) ->
  69. application:stop(lager),
  70. application:stop(goldrush),
  71. lager_util:delete_test_dir(Dir),
  72. 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.