瀏覽代碼

fx: 代码整理

master
SisMaker 3 年之前
父節點
當前提交
51df2e4c97
共有 12 個文件被更改,包括 128 次插入109 次删除
  1. +3
    -3
      eLog.sample.config
  2. +1
    -1
      include/lgCom.hrl
  3. +5
    -4
      include/lgDef.hrl
  4. +4
    -0
      src/backend/lgBkdConsole.erl
  5. +31
    -33
      src/backend/lgBkdFile.erl
  6. +28
    -14
      src/crashLog/lgCrashLog.erl
  7. +3
    -3
      src/eLog_sup.erl
  8. +4
    -4
      src/errLogger/lgErrLoggerH.erl
  9. +2
    -2
      src/formatter/lgFmtTer.erl
  10. +1
    -1
      src/mgrKiller/lgMgrKiller.erl
  11. +32
    -29
      src/rotator/lgRotatorIns.erl
  12. +14
    -15
      src/utils/lgUtil.erl

+ 3
- 3
eLog.sample.config 查看文件

@ -58,17 +58,17 @@
%% ********************************************** 日志文件配置相关 ************************************************
%% 可选的日志路径, 默认情况下是当前路径
{logRoot, "./log"},
{logRoot, &lt;<&#34;./log";>>;},
%% crash log cfg
%% 有效值 string | false 值为 false 的时候 没有 crash logger.
{crashLogFile, "crash.log"},
{crashLogFile, &lt;<&#34;crash.log";>>;},
%%崩溃日志中事件的最大大小(以字节为单位)-默认为65536
{crashLogMsgSize, 65536},
%% 崩溃日志的最大大小(以字节为单位),在旋转之前,设置为0以禁用旋转-默认值为0
{crashLogFileSize, 0},
%% 什么时间轮换崩溃日志-默认为无时间轮换。有关此格式的说明,请参见自述文件。
{crashLogDate, "$D0"},
{crashLogDate, &lt;<&#34;$D0";>>;},
%% 要保留的已轮转崩溃日志的数量,0表示仅保留当前的一个-默认值为0
{crashLogCount, 0},
%% 崩溃日志旋转器模块-默认为lager_rotator_default

+ 1
- 1
include/lgCom.hrl 查看文件

@ -6,7 +6,7 @@
-define(eLogEts, eLogEts).
-define(eLogPtTl, eLogPtTl).
-define(LgDefSink, lgEvent).
-define(LgDefSink, eLogEvent).
-define(LgDefTruncation, 4096).
%%

+ 5
- 4
include/lgDef.hrl 查看文件

@ -55,7 +55,7 @@
%% BkdFile选项默认值
-define(LgDefLogLevel, info).
-define(LgDefRotateSize, 10485760). %% 10mb
-define(LgDefRotateDate, "$D0"). %% midnight
-define(LgDefRotateDate, <<"$D0";>>;). %% midnight
-define(LgDefRotateCnt, 5).
-define(LgDefRotateMod, lgRotatorIns).
-define(LgDefSyncLevel, error).
@ -67,13 +67,14 @@
-define(LgDefFlushThr, 10).
-define(LgDefFmtTer, lgFmtTer).
-define(LgDefFormatterCfg, []).
-define(LgDefLogRoot, <<"./log">>).
%%
-define(LgDefHandler,
[
{lgBkdConsole, [{level, info}]},
{lgBkdFile, [{id, error}, {file, <<"./log/error.log">>}, {level, '>=error'}, {size, 10485760}, {date, "$D0"}, {count, 5}]},
{lgBkdFile, [{id, console}, {file, <<"./log/console.log">>}, {level, '>=debug'}, {size, 10485760}, {date, "$D0"}, {count, 5}]}
{lgBkdConsole, [{level, '>=info'}]},
{lgBkdFile, [{id, error}, {file, <<"error.log">>}, {level, '>=error'}, {size, 10485760}, {date, "$D0"}, {count, 5}]},
{lgBkdFile, [{id, console}, {file, <<"console.log">>}, {level, '>=debug'}, {size, 10485760}, {date, "$D0"}, {count, 5}]}
]).
-record(lgShaper, {

+ 4
- 0
src/backend/lgBkdConsole.erl 查看文件

@ -83,6 +83,8 @@ handleCall({mSetLogLevel, Level}, State) ->
LevelMask ->
{reply, ok, State#state{level = LevelMask}}
end;
handleCall({mRotate, _}, State) ->
{reply, ok, State};
handleCall(_Msg, State) ->
?ERR("~p call receive unexpect msg ~p ~n ", [?MODULE, _Msg]),
{reply, ok, State}.
@ -101,6 +103,8 @@ handleEvent(_Msg, _State) ->
handleInfo({'DOWN', _, process, Out, _}, #state{out = Out}) ->
removeEpm;
handleInfo({mRotate, _}, _State) ->
kpS;
handleInfo(_Msg, _State) ->
?ERR("~p info receive unexpect msg ~p ~n", [?MODULE, _Msg]),
kpS.

+ 31
- 33
src/backend/lgBkdFile.erl 查看文件

@ -30,6 +30,7 @@
-record(state, {
fileName :: string(),
fBName :: string(),
level :: lgMaskLevel(),
fd :: file:io_device() | undefined,
inode :: integer() | undefined,
@ -53,7 +54,7 @@
-spec init([lgFileOpt(), ...]) -> {ok, #state{}} | {error, atom()}.
init(Opts) ->
true = checkOpts(Opts, false),
RelName = lgUtil:get_opt(file, Opts, undefined),
FBName = lgUtil:get_opt(file, Opts, undefined),
CfgLevel = lgUtil:get_opt(level, Opts, ?LgDefLogLevel),
CfgDate = lgUtil:get_opt(date, Opts, ?LgDefRotateDate),
Size = lgUtil:get_opt(size, Opts, ?LgDefRotateSize),
@ -74,20 +75,22 @@ init(Opts) ->
SyncOn = lgUtil:configToMask(CfgSyncOn),
CheckInt = ?IIF(CfgCheckInt == always, 0, CfgCheckInt),
{ok, Date} = lgUtil:parseRotateSpec(CfgDate),
FileName = lgUtil:parsePath(RelName),
scheduleRotation(Date, FileName),
FileName = lgUtil:parsePath(FBName),
scheduleRotation(Date, FBName),
FmtCfg = ?IIF(CfgFmtCfg =/= [], CfgFmtCfg, begin MdWhitelist = lgUtil:get_env(mdWhitelist, []), lgFmtTer:fmtCfg(MdWhitelist) end),
Shaper = #lgShaper{hwm = Hwm, flushQueue = FlushQueue, flushThr = FlushThr, id = FileName},
Shaper = #lgShaper{hwm = Hwm, flushQueue = FlushQueue, flushThr = FlushThr, id = FBName},
TemState = #state{
fileName = FileName, level = Level, size = Size, date = Date
fileName = FileName, fBName = FBName, level = Level, size = Size, date = Date
, count = Count, rotator = Rotator, shaper = Shaper
, fmtTer = FmtTer, fmtCfg = FmtCfg
, syncOn = SyncOn, syncInt = SyncInt
, syncSize = SyncSize, checkInt = CheckInt
},
case Rotator:createLogFile(FileName, {SyncSize, SyncInt}) of
{ok, Fd, Inode, CTime, _Size} ->
?INT_LOG(?error, "Failed to open log file ~ts 1111", [FileName]),
{ok, TemState#state{fd = Fd, inode = Inode, cTime = CTime}};
{error, Reason} ->
?INT_LOG(?error, "Failed to open log file ~ts with error ~s", [FileName, file:format_error(Reason)]),
@ -96,33 +99,33 @@ init(Opts) ->
handleCall(mGetLogLevel, #state{level = Level} = State) ->
{reply, Level, State};
handleCall({mSetLogLevel, Level}, #state{fileName = FileName} = State) ->
handleCall({mSetLogLevel, Level}, #state{fBName = FBName} = State) ->
case lgUtil:validateLogLevel(Level) of
false ->
{reply, {error, bad_loglevel}, State};
LevelMask ->
?INT_LOG(?notice, "Changed loglevel of ~s to ~p", [FileName, Level]),
?INT_LOG(?notice, "Changed loglevel of ~s to ~p", [FBName, Level]),
{reply, ok, State#state{level = LevelMask}}
end;
handleCall({mSetLogHwm, Hwm}, #state{shaper = Shaper, fileName = FileName} = State) ->
handleCall({mSetLogHwm, Hwm}, #state{shaper = Shaper, fBName = FBName} = State) ->
case checkOpts([{hwm, Hwm}], true) of
false ->
{reply, {error, badHwm}, State};
_ ->
NewShaper = Shaper#lgShaper{hwm = Hwm},
?INT_LOG(?notice, "Changed loghwm of ~ts to ~p", [FileName, Hwm]),
?INT_LOG(?notice, "Changed loghwm of ~ts to ~p", [FBName, Hwm]),
{reply, {lastHwm, Shaper#lgShaper.hwm}, State#state{shaper = NewShaper}}
end;
handleCall(mRotate, State = #state{fileName = File}) ->
{ok, NewState} = handleInfo({mRotate, File}, State),
handleCall(mRotate, State = #state{fBName = FBName}) ->
{ok, NewState} = handleInfo({mRotate, FBName}, State),
{reply, ok, NewState};
handleCall(_Msg, State) ->
?ERR("~p call receive unexpect msg ~p ~n ", [?MODULE, _Msg]),
{reply, ok, State}.
handleEvent({mWriteLog, Message}, #state{fileName = FileName, level = Level, shaper = Shaper, fmtTer = FmtTer, fmtCfg = FmtCfg} = State) ->
case lgUtil:isLoggAble(Message, Level, {lgBkdFile, FileName}) of
handleEvent({mWriteLog, Message}, #state{fBName = FBName, level = Level, shaper = Shaper, fmtTer = FmtTer, fmtCfg = FmtCfg} = State) ->
case lgUtil:isLoggAble(Message, Level, {lgBkdFile, FBName}) of
true ->
#lgMsg{timestamp = Timestamp, severity = Severity} = Message,
case lgUtil:checkHwm(Shaper) of
@ -151,12 +154,11 @@ handleEvent(_Msg, _State) ->
?ERR("~p event receive unexpect msg ~p ~n ", [?MODULE, _Msg]),
kpS.
handleInfo({mRotate, File}, #state{fileName = File, count = Count, date = Date, rotator = Rotator} = State) ->
handleInfo({mRotate, FBName}, #state{fBName = FBName, date = Date} = State) ->
NewState = closeFile(State),
_ = Rotator:rotateLogFile(File, Count),
scheduleRotation(File, Date),
scheduleRotation(Date, FBName),
{ok, NewState};
handleInfo({mShaperExpired, Name}, #state{shaper = Shaper, fileName = Name, fmtTer = FmtTer, fmtCfg = FmtCfg} = State) ->
handleInfo({mShaperExpired, FBName}, #state{shaper = Shaper, fBName = FBName, fmtTer = FmtTer, fmtCfg = FmtCfg} = State) ->
case Shaper#lgShaper.dropped of
0 ->
ignore;
@ -180,7 +182,7 @@ terminate(_Reason, State) ->
code_change(_OldVsn, State, _Extra) ->
{ok, State}.
writeLog(#state{fileName = FileName, fd = Fd, inode = Inode, cTime = CTime, flap = Flap, size = RotSize, count = Count, rotator = Rotator, lastCheck = LastCheck, checkInt = CheckInt, syncSize = SyncSize, syncInt = SyncInt} = State, Timestamp, Level, Msg) ->
writeLog(#state{fileName = FileName, fd = Fd, inode = Inode, cTime = CTime, flap = Flap, size = RotSize, rotator = Rotator, lastCheck = LastCheck, checkInt = CheckInt, syncSize = SyncSize, syncInt = SyncInt} = State, Timestamp, Level, Msg) ->
case isWriteCheck(Fd, LastCheck, CheckInt, FileName, Inode, CTime, Timestamp) of
true ->
%% need to check for rotation
@ -188,18 +190,13 @@ writeLog(#state{fileName = FileName, fd = Fd, inode = Inode, cTime = CTime, flap
{ok, NewFD, NewInode, NewCTime, FileSize} ->
case RotSize > 0 andalso FileSize > RotSize of
true ->
TemState = closeFile(State),
case Rotator:rotateLogFile(FileName, Count) of
ok ->
%% go around the loop again, we'll do another rotation check and hit the next clause of ensureLogFile
writeLog(TemState, Timestamp, Level, Msg);
{error, Reason} ->
?IIF(Flap, State, begin ?INT_LOG(?error, "Failed to rotate log file ~ts with error ~s", [FileName, file:format_error(Reason)]), State#state{flap = true} end)
end;
NewState = closeFile(State),
%% go around the loop again, we'll do another rotation check and hit the next clause of ensureLogFile
writeLog(NewState, Timestamp, Level, Msg);
_ ->
%% update our last check and try again
TemState = State#state{lastCheck = Timestamp, fd = NewFD, inode = NewInode, cTime = NewCTime},
writeFile(TemState, Level, Msg)
NewState = State#state{lastCheck = Timestamp, fd = NewFD, inode = NewInode, cTime = NewCTime},
writeFile(NewState, Level, Msg)
end;
{error, Reason} ->
?IIF(Flap, State, begin ?INT_LOG(?error, "Failed to reopen log file ~ts with error ~s", [FileName, file:format_error(Reason)]), State#state{flap = true} end)
@ -291,13 +288,13 @@ checkOpts([{id, _} | Tail], IsFile) ->
checkOpts([Other | _Tail], _IsFile) ->
{error, {invalid_opt, Other}}.
scheduleRotation(undefined, _FileName) ->
scheduleRotation(undefined, _FBName) ->
ok;
scheduleRotation(Date, Name) ->
erlang:send_after(lgUtil:calcNextRotateMs(Date), self(), {mRotate, Name}),
scheduleRotation(Date, FBName) ->
erlang:send_after(lgUtil:calcNextRotateMs(Date), self(), {mRotate, FBName}),
ok.
closeFile(#state{fd = Fd} = State) ->
closeFile(#state{fBName = FBName, fd = Fd} = State) ->
case Fd of
undefined -> State;
_ ->
@ -306,5 +303,6 @@ closeFile(#state{fd = Fd} = State) ->
_ = file:datasync(Fd),
_ = file:close(Fd),
_ = file:close(Fd),
State#state{fd = undefined}
NewFileName = lgUtil:parsePath(FBName),
State#state{fileName = NewFileName, fd = undefined}
end.

+ 28
- 14
src/crashLog/lgCrashLog.erl 查看文件

@ -32,6 +32,7 @@
-record(state, {
fileName :: string() %%
, fBName :: string() %%
, fd :: pid() | undefined %%
, inode :: integer() | undefined %% inode信息
, cTime :: file:date_time() | undefined %%
@ -43,22 +44,22 @@
, rotator :: atom() %%
}).
start(Filename, MaxFmtSize, MaxFileSize, Date, Count, Rotator) ->
gen_srv:start({local, ?MODULE}, ?MODULE, {Filename, MaxFmtSize, MaxFileSize, Date, Count, Rotator}, []).
start(FBName, MaxFmtSize, MaxFileSize, Date, Count, Rotator) ->
gen_srv:start({local, ?MODULE}, ?MODULE, {FBName, MaxFmtSize, MaxFileSize, Date, Count, Rotator}, []).
start_link(Filename, MaxFmtSize, MaxFileSize, Date, Count, Rotator) ->
gen_srv:start_link({local, ?MODULE}, ?MODULE, {Filename, MaxFmtSize, MaxFileSize, Date, Count, Rotator}, []).
start_link(FBName, MaxFmtSize, MaxFileSize, Date, Count, Rotator) ->
gen_srv:start_link({local, ?MODULE}, ?MODULE, {FBName, MaxFmtSize, MaxFileSize, Date, Count, Rotator}, []).
init({RelFilename, MaxFmtSize, MaxFileSize, CfgDate, Count, Rotator}) ->
init({FBName, MaxFmtSize, MaxFileSize, CfgDate, Count, Rotator}) ->
{ok, Date} = lgUtil:parseRotateSpec(CfgDate),
Filename = lgUtil:parsePath(RelFilename),
Filename = lgUtil:parsePath(FBName),
case Rotator:openLogFile(Filename, false) of
{ok, Fd, Inode, CTime, _Size} ->
scheduleRotation(Date),
{ok, #state{fileName = Filename, fd = Fd, inode = Inode, cTime = CTime, maxFmtSize = MaxFmtSize, maxFileSize = MaxFileSize, date = Date, count = Count, rotator = Rotator}};
{ok, #state{fileName = Filename, fBName = FBName, fd = Fd, inode = Inode, cTime = CTime, maxFmtSize = MaxFmtSize, maxFileSize = MaxFileSize, date = Date, count = Count, rotator = Rotator}};
{error, Reason} ->
?INT_LOG(?error, "Failed to open crash log file ~ts with error: ~s", [Filename, file:format_error(Reason)]),
{ok, #state{fileName = Filename, maxFmtSize = MaxFmtSize, maxFileSize = MaxFileSize, date = Date, count = Count, flap = true, rotator = Rotator}}
{ok, #state{fileName = Filename, fBName = FBName, maxFmtSize = MaxFmtSize, maxFileSize = MaxFileSize, date = Date, count = Count, flap = true, rotator = Rotator}}
end.
handleCall({mWriteLog, Event}, State, _From) ->
@ -75,10 +76,10 @@ handleCast(_Msg, _State) ->
handleInfo({mWriteLog, Event}, State) ->
{_, NewState} = writeLog(Event, State),
{noreply, NewState};
handleInfo(mRotate, #state{fileName = Name, count = Count, date = Date, rotator = Rotator}) ->
_ = Rotator:rotateLogFile(Name, Count),
handleInfo(mRotate, #state{date = Date} = State) ->
NewState = closeFile(State),
scheduleRotation(Date),
kpS;
{ok,pan> NewState};
handleInfo(_Msg, _State) ->
?ERR("~p info receive unexpect msg ~p ~n ", [?MODULE, _Msg]),
kpS.
@ -94,6 +95,19 @@ scheduleRotation(Date) ->
erlang:send_after(lgUtil:calcNextRotateMs(Date), self(), mRotate),
ok.
closeFile(#state{fBName = FBName, fd = Fd} = State) ->
case Fd of
undefined -> State;
_ ->
%% Flush and close any file handles.
%% delayed write can cause file:close not to do a close
_ = file:datasync(Fd),
_ = file:close(Fd),
_ = file:close(Fd),
NewFileName = lgUtil:parsePath(FBName),
State#state{fileName = NewFileName, fd = undefined}
end.
otherNodeSuffix(Pid) when node(Pid) =/= node() ->
PidNode = node(Pid),
case PidNode =/= node() of
@ -147,7 +161,7 @@ saslLimitedStr(progress, Report, FmtMaxBytes) ->
saslLimitedStr(crash_report, Report, FmtMaxBytes) ->
eFmt:formatBin("~p~n", [Report], [{charsLimit, FmtMaxBytes}]).
writeLog(Event, #state{fileName = FileName, fd = FD, inode = Inode, cTime = CTime, flap = Flap, maxFmtSize = FmtMaxBytes, maxFileSize = RotSize, count = Count, rotator = Rotator} = State) ->
writeLog(Event, #state{fileName = FileName, fd = FD, inode = Inode, cTime = CTime, flap = Flap, maxFmtSize = FmtMaxBytes, maxFileSize = RotSize, rotator = Rotator} = State) ->
%% borrowed from riak_err
{ReportStr, Pid, MsgStr, _ErrorP} =
case Event of
@ -168,8 +182,8 @@ writeLog(Event, #state{fileName = FileName, fd = FD, inode = Inode, cTime = CTim
{ok, NewFD, NewInode, NewCTime, FileSize} ->
case RotSize > 0 andalso FileSize > RotSize of
true ->
_ = Rotator:rotateLogFile(FileName, Count),
handleCast({mWriteLog, Event}, State);
NewState = closeFile(State),
handleCast({mWriteLog, Event}, NewState);
_ ->
TimeBinStr = lgUtil:msToBinStr(),
Time = [TimeBinStr, <<" =">>, ReportStr, <<"====\n">>],

+ 3
- 3
src/eLog_sup.erl 查看文件

@ -45,8 +45,8 @@ init(_Args) ->
},
LgEventSpec = #{
id => lgEvent,
start => {gen_emm, start_link, [{local, lgEvent}]},
id => ?LgDefSink,
start => {gen_emm, start_link, [{local, ?LgDefSink}]},
restart => permanent,
shutdown => 5000,
type => worker,
@ -70,7 +70,7 @@ init(_Args) ->
MsgMaxBytes = lgUtil:get_env(crashLogMsgSize, 65536),
RotationSize = lgUtil:get_env(crashLogFileSize, 0),
RotationCount = lgUtil:get_env(crashLogCount, 0),
RotationDate = lgUtil:get_env(crashLogDate, "$D0"),
RotationDate = lgUtil:get_env(crashLogDate, <<"$D0";>>;),
RotationMod = lgUtil:get_env(crashLogRotator, ?LgDefRotateMod),
CrashLogSpec = #{
id => lgCrashLog,

+ 4
- 4
src/errLogger/lgErrLoggerH.erl 查看文件

@ -45,9 +45,9 @@
true ->
case is_pid(PidOrMd) of
true ->
eLog:doLogImpl(Severity, PidOrMd, undefined, undefined, undefined, 0, [], Msg, [], 0, Sink, safe);
eLog:doLogImpl(Severity, PidOrMd, 'Undef', 'Undef', 'Undef', 0, [], Msg, [], 0, Sink, safe);
_ ->
eLog:doLogImpl(Severity, self(), undefined, undefined, undefined, 0, PidOrMd, Msg, [], 0, Sink, safe)
eLog:doLogImpl(Severity, self(), 'Undef', 'Undef', 'Undef', 0, PidOrMd, Msg, [], 0, Sink, safe)
end,
logged;
_ -> no_log
@ -60,9 +60,9 @@
true ->
case is_pid(PidOrMd) of
true ->
eLog:doLogImpl(Severity, PidOrMd, undefined, undefined, undefined, 0, [], Fmt, Args, 0, Sink, safe);
eLog:doLogImpl(Severity, PidOrMd, 'Undef', 'Undef', 'Undef', 0, [], Fmt, Args, 0, Sink, safe);
_ ->
eLog:doLogImpl(Severity, self(), undefined, undefined, undefined, 0, PidOrMd, Fmt, Args, 0, Sink, safe)
eLog:doLogImpl(Severity, self(), 'Undef', 'Undef', 'Undef', 0, PidOrMd, Fmt, Args, 0, Sink, safe)
end,
logged;
_ -> no_log

+ 2
- 2
src/formatter/lgFmtTer.erl 查看文件

@ -59,9 +59,9 @@ format(LgMsg, Config, Colors) ->
].
fmtCfg([]) ->
[datetime, <<"[">>, severity, <<"]">>, node, <<"|">>, pid, <<"|">>, module, <<"|">>, function, <<"|">>, line, <<"|">>, message, <<"\n">>];
[datetime, sev, node, <<"|">>, pid, <<"|">>, module, <<"|">>, function, <<"|">>, line, <<"|">>, message, <<"\n">>];
fmtCfg(MetaWhitelist) ->
[datetime, <<"[">>, severity, <<"]">>, node, <<"|">>, pid, <<"|">>, module, <<"|">>, function, <<"|">>, line, <<"|">>] ++
[datetime, sev, node, <<"|">>, pid, <<"|">>, module, <<"|">>, function, <<"|">>, line, <<"|">>] ++
[{M, [atom_to_binary(M), <<"=">>, M, "|"], [<<>>]} || M <- MetaWhitelist] ++ [message, <<"\n">>].
% Level, Pid, Node, Module, Function, FunctionArity, Line

+ 1
- 1
src/mgrKiller/lgMgrKiller.erl 查看文件

@ -24,7 +24,7 @@
}).
kill_me() ->
gen_emm:call(lgEvent, ?MODULE, mKillSelf).
gen_emm:call(?LgDefSink, ?MODULE, mKillSelf).
init([KillerHwm, KillerReinstallAfter]) ->
{ok, #state{killerHwm = KillerHwm, killerReTime = KillerReinstallAfter}}.

+ 32
- 29
src/rotator/lgRotatorIns.erl 查看文件

@ -61,36 +61,39 @@ reopenLogFile(FileName, Fd, Buffer) ->
_ = file:close(Fd),
openLogFile(FileName, Buffer).
%% renames failing are OK
%% IMY-TODO
rotateLogFile(File, 0) ->
%% open the file in write-only mode to truncate/create it
case file:open(File, [write]) of
{ok, FD} ->
_ = file:close(FD),
_ = file:close(FD),
tryUpdateCTime(File),
ok;
Error ->
Error
end;
rotateLogFile(File0, 1) ->
File1 = <<File0/binary, ".0">>,
_ = file:rename(File0, File1),
rotateLogFile(File0, 0);
rotateLogFile(File0, Count) ->
File1 = <<File0/binary, ".", (integer_to_binary(Count - 2))/binary>>,
File2 = <<File0/binary, ".", (integer_to_binary(Count - 1))/binary>>,
_ = file:rename(File1, File2),
rotateLogFile(File0, Count - 1).
rotateLogFile(_File, _Count) ->
ok.
tryUpdateCTime(Name) ->
case file:read_file_info(Name, [raw]) of
{ok, FInfo} ->
tryUpdateCTime(Name, FInfo);
_ ->
erlang:localtime()
end.
%% %% renames failing are OK
%% %% IMY-TODO
%% rotateLogFile(File, 0) ->
%% %% open the file in write-only mode to truncate/create it
%% case file:open(File, [write]) of
%% {ok, FD} ->
%% _ = file:close(FD),
%% _ = file:close(FD),
%% tryUpdateCTime(File),
%% ok;
%% Error ->
%% Error
%% end;
%% rotateLogFile(File0, 1) ->
%% File1 = <<File0/binary, ".0">>,
%% _ = file:rename(File0, File1),
%% rotateLogFile(File0, 0);
%% rotateLogFile(File0, Count) ->
%% File1 = <<File0/binary, ".", (integer_to_binary(Count - 2))/binary>>,
%% File2 = <<File0/binary, ".", (integer_to_binary(Count - 1))/binary>>,
%% _ = file:rename(File1, File2),
%% rotateLogFile(File0, Count - 1).
%%
%% tryUpdateCTime(Name) ->
%% case file:read_file_info(Name, [raw]) of
%% {ok, FInfo} ->
%% tryUpdateCTime(Name, FInfo);
%% _ ->
%% erlang:localtime()
%% end.
tryUpdateCTime(Name, FileInfo) ->
case os:type() of

+ 14
- 15
src/utils/lgUtil.erl 查看文件

@ -19,6 +19,7 @@
, nowMs/0
, msToBinStr/0
, msToBinStr/1
, curYMDHMStr/0
, parseRotateSpec/1
, calcNextRotateMs/1
, calcNextRotateMs/2
@ -192,6 +193,12 @@ msToBinStr(MsTick) ->
{{Y, M, D}, {H, Mi, S}} = erlang:universaltime_to_localtime(erlang:posixtime_to_universaltime(ThisSec)),
<<(integer_to_binary(Y))/binary, "-", (i2b(M))/binary, "-", (i2b(D))/binary, " ", (i2b(H))/binary, ":", (i2b(Mi))/binary, ":", (i2b(S))/binary, ".", (i3b(ThisMs))/binary>>.
curYMDHMStr() ->
{{Y, M, D}, {H, Mi, _S}} = lgTime:curDateTime(),
<<(integer_to_binary(Y))/binary, (i2b(M))/binary, (i2b(D))/binary, (i2b(H))/binary, (i2b(Mi))/binary>>.
i2b(Num) ->
if
Num < 10 ->
@ -248,7 +255,8 @@ parseRotateDateSpec(_, _DayOrMonthF, _Hour, _Minute, _DayOrMonthV) ->
{error, invalid_date_spec}.
parseRotateSpec(Spec) ->
case parseRotateDateSpec(Spec, undefined, undefined, undefined, undefined) of
SpecList = ?IIF(is_binary(Spec), binary_to_list(Spec), Spec),
case parseRotateDateSpec(SpecList, undefined, undefined, undefined, undefined) of
{error, _} = ErrRet ->
ErrRet;
{undefined, undefined, undefined, _} ->
@ -483,20 +491,11 @@ isLoggAble(LgMsg, Mask, MyName) ->
#lgMsg{severity = Severity, destinations = Destinations} = LgMsg,
(Severity band Mask) =/= 0 orelse lists:member(MyName, Destinations).
parsePath(RelPath) ->
NewRelPath =
case lgUtil:get_env(logRoot, undefined) of
undefined ->
RelPath;
LogRoot ->
case filename:dirname(RelPath) of
"." ->
filename:join(LogRoot, RelPath);
false ->
RelPath
end
end,
filename:absname(NewRelPath).
parsePath(FBName) ->
LogRoot = lgUtil:get_env(logRoot, ?LgDefLogRoot),
TimeFileName = <<(lgUtil:curYMDHMStr())/binary, "_", FBName/binary>>,
WholeFileName = filename:join(LogRoot, TimeFileName),
filename:absname(WholeFileName).
%% Find a file among the already installed handlers.
%%

Loading…
取消
儲存