From cd5f69dafe7d42b949234c373e1f449989454a11 Mon Sep 17 00:00:00 2001 From: Luke Bakken Date: Fri, 2 Aug 2019 07:36:54 -0700 Subject: [PATCH] Factor out common code into lager_util:has_file_changed --- src/lager_file_backend.erl | 8 ++------ src/lager_rotator_default.erl | 25 +++++-------------------- src/lager_util.erl | 25 ++++++++++++++++++++++++- 3 files changed, 31 insertions(+), 27 deletions(-) diff --git a/src/lager_file_backend.erl b/src/lager_file_backend.erl index 862e821..83a0b3c 100644 --- a/src/lager_file_backend.erl +++ b/src/lager_file_backend.erl @@ -289,12 +289,8 @@ write_should_check(#state{last_check=LastCheck0, check_interval=CheckInterval, % TODO this code is duplicated in the default rotator, but we need % to know if the file has changed "out from under lager" so we don't % write to an invalid FD - case file:read_file_info(Name, [raw]) of - {ok, #file_info{inode=Inode1, ctime=Ctime1}} -> - Inode0 =/= Inode1 orelse Ctime0 =/= Ctime1; - _ -> - true - end + {Result, _FInfo} = lager_util:has_file_changed(Name, Inode0, Ctime0), + Result end. do_write(#state{fd=FD, name=Name, flap=Flap} = State, Level, Msg) -> diff --git a/src/lager_rotator_default.erl b/src/lager_rotator_default.erl index 2d8a14f..f910c73 100644 --- a/src/lager_rotator_default.erl +++ b/src/lager_rotator_default.erl @@ -42,26 +42,11 @@ open_logfile(Name, Buffer) -> ensure_logfile(Name, undefined, _Inode, _Ctime, Buffer) -> open_logfile(Name, Buffer); ensure_logfile(Name, FD, Inode0, Ctime0, Buffer) -> - case file:read_file_info(Name, [raw]) of - {ok, FInfo} -> - {OsType, _} = os:type(), - Inode1 = FInfo#file_info.inode, - Ctime1 = FInfo#file_info.ctime, - case {OsType, Inode0 =:= Inode1, Ctime0 =:= Ctime1} of - % Note: on win32, Inode is always zero - % So check the file's ctime to see if it - % needs to be re-opened - {win32, _, false} -> - reopen_logfile(Name, FD, Buffer); - {win32, _, true} -> - {ok, {FD, Inode0, Ctime0, FInfo#file_info.size}}; - {unix, true, _} -> - {ok, {FD, Inode0, Ctime0, FInfo#file_info.size}}; - {unix, false, _} -> - reopen_logfile(Name, FD, Buffer) - end; - _ -> - reopen_logfile(Name, FD, Buffer) + case lager_util:has_file_changed(Name, Inode0, Ctime0) of + {true, _FInfo} -> + reopen_logfile(Name, FD, Buffer); + {_, FInfo} -> + {ok, {FD, Inode0, Ctime0, FInfo#file_info.size}} end. reopen_logfile(Name, FD0, Buffer) -> diff --git a/src/lager_util.erl b/src/lager_util.erl index 1c64c00..852b169 100644 --- a/src/lager_util.erl +++ b/src/lager_util.erl @@ -27,7 +27,8 @@ localtime_ms/0, localtime_ms/1, maybe_utc/1, parse_rotation_date_spec/1, calculate_next_rotation/1, validate_trace/1, check_traces/4, is_loggable/3, trace_filter/1, trace_filter/2, expand_path/1, find_file/2, check_hwm/1, check_hwm/2, - make_internal_sink_name/1, otp_version/0, maybe_flush/2 + make_internal_sink_name/1, otp_version/0, maybe_flush/2, + has_file_changed/3 ]). -ifdef(TEST). @@ -40,6 +41,8 @@ -include("lager.hrl"). +-include_lib("kernel/include/file.hrl"). + levels() -> [debug, info, notice, warning, error, critical, alert, emergency, none]. @@ -592,6 +595,26 @@ maybe_flush(undefined, #lager_shaper{} = S) -> maybe_flush(Flag, #lager_shaper{} = S) when is_boolean(Flag) -> S#lager_shaper{flush_queue = Flag}. +-spec has_file_changed(Name :: file:name_all(), + Inode0 :: pos_integer(), + Ctime0 :: file:date_time()) -> {boolean(), file:file_info()}. +has_file_changed(Name, Inode0, Ctime0) -> + {OsType, _} = os:type(), + F = file:read_file_info(Name, [raw]), + case {OsType, F} of + {win32, {ok, #file_info{ctime=Ctime1}=FInfo}} -> + % Note: on win32, Inode is always zero + % So check the file's ctime to see if it + % needs to be re-opened + Changed = Ctime0 =/= Ctime1, + {Changed, FInfo}; + {_, {ok, #file_info{inode=Inode1}=FInfo}} -> + Changed = Inode0 =/= Inode1, + {Changed, FInfo}; + {_, _} -> + {true, undefined} + end. + -ifdef(TEST). parse_test() ->