From 31a5fc5b133ced8b17ef5caa0d3fe2dc7d0df431 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-S=C3=A9bastien=20P=C3=A9dron?= Date: Mon, 11 Jan 2016 16:14:43 +0100 Subject: [PATCH 1/2] lager_file_backend: Close file after time-based rotation Before, the old file was still being used until the next `check_interval`, where the file was recreated and reopened. --- src/lager_file_backend.erl | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/lager_file_backend.erl b/src/lager_file_backend.erl index 1c18dc4..b49861e 100644 --- a/src/lager_file_backend.erl +++ b/src/lager_file_backend.erl @@ -178,16 +178,15 @@ handle_event(_Event, State) -> %% @private handle_info({rotate, File}, #state{name=File,count=Count,date=Date} = State) -> _ = lager_util:rotate_logfile(File, Count), + State1 = close_file(State), schedule_rotation(File, Date), - {ok, State}; + {ok, State1}; handle_info(_Info, State) -> {ok, State}. %% @private -terminate(_Reason, #state{fd=FD}) -> - %% flush and close any file handles - _ = file:datasync(FD), - _ = file:close(FD), +terminate(_Reason, State) -> + close_file(State), ok. %% @private @@ -401,6 +400,14 @@ schedule_rotation(Name, Date) -> erlang:send_after(lager_util:calculate_next_rotation(Date) * 1000, self(), {rotate, Name}), ok. +close_file(#state{fd=undefined} = State) -> + State; +close_file(#state{fd=FD} = State) -> + %% Flush and close any file handles. + _ = file:datasync(FD), + _ = file:close(FD), + State#state{fd=undefined}. + -ifdef(TEST). get_loglevel_test() -> From 063d628549b9bd1ec934f3be4ae715e8a17e6bb4 Mon Sep 17 00:00:00 2001 From: Mark Allen Date: Wed, 20 Jan 2016 14:39:24 -0600 Subject: [PATCH 2/2] Dialyzer insists on matching a return value --- src/lager_file_backend.erl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/lager_file_backend.erl b/src/lager_file_backend.erl index b49861e..54b59eb 100644 --- a/src/lager_file_backend.erl +++ b/src/lager_file_backend.erl @@ -186,7 +186,8 @@ handle_info(_Info, State) -> %% @private terminate(_Reason, State) -> - close_file(State), + %% leaving this function call unmatched makes dialyzer cranky + _ = close_file(State), ok. %% @private