From 3a4085d7196d2440af07f8edfd3c5f8949978232 Mon Sep 17 00:00:00 2001 From: Luke Bakken Date: Thu, 28 Feb 2019 14:55:51 -0800 Subject: [PATCH] Fix log rotation on Windows / non-Unix OSes Windows requires that file handles be closed prior to renaming files. In addition, the inode on non-Unix OSes is always zero. This PR closes the log files prior to rotation (instead of after) and ensures the case where the file descriptor is `undefined` is handled. --- src/lager_file_backend.erl | 2 +- src/lager_rotator_default.erl | 17 +++++++++++------ 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/lager_file_backend.erl b/src/lager_file_backend.erl index bdbb31a..91a7c95 100644 --- a/src/lager_file_backend.erl +++ b/src/lager_file_backend.erl @@ -190,8 +190,8 @@ handle_event(_Event, State) -> %% @private handle_info({rotate, File}, #state{name=File,count=Count,date=Date,rotator=Rotator} = State) -> - _ = Rotator:rotate_logfile(File, Count), State1 = close_file(State), + _ = Rotator:rotate_logfile(File, Count), schedule_rotation(File, Date), {ok, State1}; handle_info({shaper_expired, Name}, #state{shaper=Shaper, name=Name, formatter=Formatter, formatter_config=FormatConfig} = State) -> diff --git a/src/lager_rotator_default.erl b/src/lager_rotator_default.erl index 8893a6c..5d556a2 100644 --- a/src/lager_rotator_default.erl +++ b/src/lager_rotator_default.erl @@ -37,6 +37,8 @@ open_logfile(Name, Buffer) -> Z -> Z end. +ensure_logfile(Name, undefined, _Inode, Buffer) -> + open_logfile(Name, Buffer); ensure_logfile(Name, FD, Inode, Buffer) -> case file:read_file_info(Name) of {ok, FInfo} -> @@ -80,12 +82,15 @@ rotate_logfile(File, 0) -> Error -> Error end; -rotate_logfile(File, 1) -> - _ = file:rename(File, File++".0"), - rotate_logfile(File, 0); -rotate_logfile(File, Count) -> - _ = file:rename(File ++ "." ++ integer_to_list(Count - 2), File ++ "." ++ integer_to_list(Count - 1)), - rotate_logfile(File, Count - 1). +rotate_logfile(File0, 1) -> + File1 = File0 ++ ".0", + _ = file:rename(File0, File1), + rotate_logfile(File0, 0); +rotate_logfile(File0, Count) -> + File1 = File0 ++ "." ++ integer_to_list(Count - 2), + File2 = File0 ++ "." ++ integer_to_list(Count - 1), + _ = file:rename(File1, File2), + rotate_logfile(File0, Count - 1). -ifdef(TEST).