fix logger
This commit is contained in:
parent
db2144642b
commit
55e7860ceb
@ -19,10 +19,14 @@
|
|||||||
|
|
||||||
-define(SERVER, ?MODULE).
|
-define(SERVER, ?MODULE).
|
||||||
|
|
||||||
|
%% 缓冲区大小
|
||||||
|
-define(BUFFER_SIZE, 100).
|
||||||
|
|
||||||
-record(state, {
|
-record(state, {
|
||||||
file_name :: string(),
|
file_name :: string(),
|
||||||
date :: calendar:date(),
|
date :: calendar:date(),
|
||||||
file
|
file,
|
||||||
|
buffer = []
|
||||||
}).
|
}).
|
||||||
|
|
||||||
%%%===================================================================
|
%%%===================================================================
|
||||||
@ -52,6 +56,8 @@ init([FileName]) ->
|
|||||||
FilePath = make_file(FileName),
|
FilePath = make_file(FileName),
|
||||||
{ok, File} = file:open(FilePath, [append, binary]),
|
{ok, File} = file:open(FilePath, [append, binary]),
|
||||||
|
|
||||||
|
erlang:start_timer(5000, self(), flush_ticker),
|
||||||
|
|
||||||
{ok, #state{file = File, file_name = FileName, date = get_date()}}.
|
{ok, #state{file = File, file_name = FileName, date = get_date()}}.
|
||||||
|
|
||||||
%% @private
|
%% @private
|
||||||
@ -73,19 +79,14 @@ handle_call(_Request, _From, State = #state{}) ->
|
|||||||
{noreply, NewState :: #state{}} |
|
{noreply, NewState :: #state{}} |
|
||||||
{noreply, NewState :: #state{}, timeout() | hibernate} |
|
{noreply, NewState :: #state{}, timeout() | hibernate} |
|
||||||
{stop, Reason :: term(), NewState :: #state{}}).
|
{stop, Reason :: term(), NewState :: #state{}}).
|
||||||
handle_cast({write, Data}, State = #state{file = OldFile, file_name = FileName, date = Date}) ->
|
handle_cast({write, Data}, State = #state{buffer = Buffer}) ->
|
||||||
Line = <<(time_prefix())/binary, " ", (format(Data))/binary, $\n>>,
|
Line = <<(time_prefix())/binary, " ", (format(Data))/binary, $\n>>,
|
||||||
case maybe_new_file(Date) of
|
NBuffer = [Line|Buffer],
|
||||||
|
case length(NBuffer) >= ?BUFFER_SIZE of
|
||||||
true ->
|
true ->
|
||||||
file:close(OldFile),
|
{noreply, flush(State#state{buffer = NBuffer})};
|
||||||
|
|
||||||
FilePath = make_file(FileName),
|
|
||||||
{ok, File} = file:open(FilePath, [append, binary]),
|
|
||||||
ok = file:write(File, Line),
|
|
||||||
{noreply, State#state{file = File, date = get_date()}};
|
|
||||||
false ->
|
false ->
|
||||||
ok = file:write(OldFile, Line),
|
{noreply, State#state{buffer = NBuffer}}
|
||||||
{noreply, State}
|
|
||||||
end.
|
end.
|
||||||
|
|
||||||
%% @private
|
%% @private
|
||||||
@ -94,6 +95,9 @@ handle_cast({write, Data}, State = #state{file = OldFile, file_name = FileName,
|
|||||||
{noreply, NewState :: #state{}} |
|
{noreply, NewState :: #state{}} |
|
||||||
{noreply, NewState :: #state{}, timeout() | hibernate} |
|
{noreply, NewState :: #state{}, timeout() | hibernate} |
|
||||||
{stop, Reason :: term(), NewState :: #state{}}).
|
{stop, Reason :: term(), NewState :: #state{}}).
|
||||||
|
handle_info({timeout, _, flush_ticker}, State) ->
|
||||||
|
erlang:start_timer(5000, self(), flush_ticker),
|
||||||
|
{noreply, flush(State)};
|
||||||
handle_info(_Info, State = #state{}) ->
|
handle_info(_Info, State = #state{}) ->
|
||||||
{noreply, State}.
|
{noreply, State}.
|
||||||
|
|
||||||
@ -119,6 +123,25 @@ code_change(_OldVsn, State = #state{}, _Extra) ->
|
|||||||
%%% Internal functions
|
%%% Internal functions
|
||||||
%%%===================================================================
|
%%%===================================================================
|
||||||
|
|
||||||
|
-spec flush(State :: #state{}) -> NState :: #state{}.
|
||||||
|
flush(State = #state{buffer = []}) ->
|
||||||
|
State;
|
||||||
|
flush(State = #state{file = OldFile, file_name = FileName, date = Date, buffer = Buffer}) ->
|
||||||
|
Content = iolist_to_binary(lists:reverse(Buffer)),
|
||||||
|
case maybe_new_file(Date) of
|
||||||
|
true ->
|
||||||
|
file:close(OldFile),
|
||||||
|
|
||||||
|
FilePath = make_file(FileName),
|
||||||
|
{ok, File} = file:open(FilePath, [append, binary]),
|
||||||
|
|
||||||
|
ok = file:write(File, Content),
|
||||||
|
State#state{file = File, buffer = [], date = get_date()};
|
||||||
|
false ->
|
||||||
|
ok = file:write(OldFile, Content),
|
||||||
|
State#state{buffer = []}
|
||||||
|
end.
|
||||||
|
|
||||||
format(Data) when is_binary(Data) ->
|
format(Data) when is_binary(Data) ->
|
||||||
iolist_to_binary(Data);
|
iolist_to_binary(Data);
|
||||||
format(Items) when is_list(Items) ->
|
format(Items) when is_list(Items) ->
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user