diff --git a/eLog.sample.config b/eLog.sample.config index e56a341..a1bcd68 100644 --- a/eLog.sample.config +++ b/eLog.sample.config @@ -58,17 +58,17 @@ %% ********************************************** 日志文件配置相关 ************************************************ %% 可选的日志路径, 默认情况下是当前路径 - {logRoot, "./log"}, + {logRoot, <<"./log">>}, %% crash log cfg %% 有效值 string | false 值为 false 的时候 没有 crash logger. - {crashLogFile, "crash.log"}, + {crashLogFile, <<"crash.log">>}, %%崩溃日志中事件的最大大小(以字节为单位)-默认为65536 {crashLogMsgSize, 65536}, %% 崩溃日志的最大大小(以字节为单位),在旋转之前,设置为0以禁用旋转-默认值为0 {crashLogFileSize, 0}, %% 什么时间轮换崩溃日志-默认为无时间轮换。有关此格式的说明,请参见自述文件。 - {crashLogDate, "$D0"}, + {crashLogDate, <<"$D0">>}, %% 要保留的已轮转崩溃日志的数量,0表示仅保留当前的一个-默认值为0 {crashLogCount, 0}, %% 崩溃日志旋转器模块-默认为lager_rotator_default diff --git a/include/lgCom.hrl b/include/lgCom.hrl index 664ccaa..f283bcf 100644 --- a/include/lgCom.hrl +++ b/include/lgCom.hrl @@ -6,7 +6,7 @@ -define(eLogEts, eLogEts). -define(eLogPtTl, eLogPtTl). --define(LgDefSink, lgEvent). +-define(LgDefSink, eLogEvent). -define(LgDefTruncation, 4096). %% 日志等级定义 diff --git a/include/lgDef.hrl b/include/lgDef.hrl index fec45e3..931b87a 100644 --- a/include/lgDef.hrl +++ b/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, { diff --git a/src/backend/lgBkdConsole.erl b/src/backend/lgBkdConsole.erl index d9a51fb..966a938 100644 --- a/src/backend/lgBkdConsole.erl +++ b/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. diff --git a/src/backend/lgBkdFile.erl b/src/backend/lgBkdFile.erl index b01c51c..bc201e8 100644 --- a/src/backend/lgBkdFile.erl +++ b/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. diff --git a/src/crashLog/lgCrashLog.erl b/src/crashLog/lgCrashLog.erl index 5f311df..1a29498 100644 --- a/src/crashLog/lgCrashLog.erl +++ b/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, 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">>], diff --git a/src/eLog_sup.erl b/src/eLog_sup.erl index f98e518..1fb00e5 100644 --- a/src/eLog_sup.erl +++ b/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, diff --git a/src/errLogger/lgErrLoggerH.erl b/src/errLogger/lgErrLoggerH.erl index f1cefa0..20c9e96 100644 --- a/src/errLogger/lgErrLoggerH.erl +++ b/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 diff --git a/src/formatter/lgFmtTer.erl b/src/formatter/lgFmtTer.erl index 575d9a5..f6623ff 100644 --- a/src/formatter/lgFmtTer.erl +++ b/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 diff --git a/src/mgrKiller/lgMgrKiller.erl b/src/mgrKiller/lgMgrKiller.erl index a9b5b4b..c3f738e 100644 --- a/src/mgrKiller/lgMgrKiller.erl +++ b/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}}. diff --git a/src/rotator/lgRotatorIns.erl b/src/rotator/lgRotatorIns.erl index 98937a3..76b3ac4 100644 --- a/src/rotator/lgRotatorIns.erl +++ b/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 = <>, - _ = file:rename(File0, File1), - rotateLogFile(File0, 0); -rotateLogFile(File0, Count) -> - File1 = <>, - File2 = <>, - _ = 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 = <>, +%% _ = file:rename(File0, File1), +%% rotateLogFile(File0, 0); +%% rotateLogFile(File0, Count) -> +%% File1 = <>, +%% File2 = <>, +%% _ = 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 diff --git a/src/utils/lgUtil.erl b/src/utils/lgUtil.erl index addfcc6..752a8b7 100644 --- a/src/utils/lgUtil.erl +++ b/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. %%