소스 검색

Factor out common code into lager_util:has_file_changed

pull/509/head
Luke Bakken 5 년 전
부모
커밋
cd5f69dafe
No known key found for this signature in database GPG 키 ID: D99DE30E43EAE440
3개의 변경된 파일31개의 추가작업 그리고 27개의 파일을 삭제
  1. +2
    -6
      src/lager_file_backend.erl
  2. +5
    -20
      src/lager_rotator_default.erl
  3. +24
    -1
      src/lager_util.erl

+ 2
- 6
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) ->

+ 5
- 20
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) ->

+ 24
- 1
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() ->

불러오는 중...
취소
저장