summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/rabbit_log_tail.erl35
1 files changed, 34 insertions, 1 deletions
diff --git a/src/rabbit_log_tail.erl b/src/rabbit_log_tail.erl
index d5764c90b9..d0fb55ec84 100644
--- a/src/rabbit_log_tail.erl
+++ b/src/rabbit_log_tail.erl
@@ -1,10 +1,43 @@
-module(rabbit_log_tail).
-export([tail_n_lines/2]).
-% -export([init_tail_stream/2, tail_send/2, tail_receive/2]).
+-export([init_tail_stream/3]).
-define(GUESS_OFFSET, 200).
+init_tail_stream(Filename, Pid, Ref) ->
+ RPCProc = self(),
+ Reader = spawn(fun() ->
+ link(Pid),
+ case file:open(Filename, [read, binary]) of
+ {ok, File} ->
+ {ok, _} = file:position(File, eof),
+ RPCProc ! {Ref, opened},
+ read_loop(File, Pid, Ref);
+ {error, _} = Err ->
+ RPCProc ! {Ref, Err}
+ end
+ end),
+ receive
+ {Ref, opened} -> {ok, Ref};
+ {Ref, {error, Err}} -> {error, Err}
+ after 5000 ->
+ exit(Reader, timeout),
+ {error, timeout}
+ end.
+
+read_loop(File, Pid, Ref) ->
+ case file:read(File, ?GUESS_OFFSET) of
+ {ok, Data} ->
+ Pid ! {Ref, Data, confinue},
+ read_loop(File, Pid, Ref);
+ eof ->
+ timer:sleep(1000),
+ read_loop(File, Pid, Ref);
+ {error, _} = Err ->
+ Pid ! {Ref, Err, finished}
+ end.
+
tail_n_lines(Filename, N) ->
case file:open(Filename, [read, binary]) of
{ok, File} ->