|
|
@ -33,72 +33,66 @@ |
|
|
|
|
|
|
|
|
|
|
|
-record(state, { |
|
|
|
fileName :: string(), %% 文件名 |
|
|
|
fd :: pid() | undefined, %% 文件句柄 |
|
|
|
inode :: integer() | undefined, |
|
|
|
ctime :: file:date_time() | undefined, %% 文件创建时间 |
|
|
|
fmtmaxbytes :: integer() class="p">, %% 单个消息最大字节数 |
|
|
|
size :: integer(), %% 单个日志文件最大字节数 |
|
|
|
date :: undefined | string(), %% 旋转的时间格式 |
|
|
|
count :: integer(), %% 要保留的已轮转崩溃日志的数量 |
|
|
|
flap = false :: boolean(), %% ???? 这是干啥的呢 |
|
|
|
rotator :: atom() %% 旋转模块 |
|
|
|
fileName :: string() %% 文件名 |
|
|
|
, fd :: pid() | undefined %% 文件句柄 |
|
|
|
, inode :: integer() | undefined %% 文件inode信息 |
|
|
|
, ctime :: file:date_time() | undefined %% 文件创建时间 |
|
|
|
, maxFmtSize :: integer() %% 单个消息最大字节数 |
|
|
|
, maxFileSize :: integer() %% 单个日志文件最大字节数 |
|
|
|
, date :: undefined | string() %% 旋转的时间格式 |
|
|
|
, count :: integer() %% 要保留的已轮转崩溃日志的数量 |
|
|
|
, flap = false :: boolean() %% ???? 这是干啥的呢 |
|
|
|
, rotator :: atom() %% 旋转模块实例 |
|
|
|
}). |
|
|
|
|
|
|
|
start(Filename, MaxBytes, Size, Date, Count, Rotator) -> |
|
|
|
gen_srv:start({local, ?MODULE}, ?MODULE, {Filename, MaxBytes, Size, Date, Count, Rotator}, []). |
|
|
|
start(Filename, MaxFmtSize, MaxFileSize, Date, Count, Rotator) -> |
|
|
|
gen_srv:start({local, ?MODULE}, ?MODULE, {Filename, MaxFmtSize, MaxFileSize, Date, Count, Rotator}, []). |
|
|
|
|
|
|
|
start_link(Filename, MaxBytes, Size, Date, Count, Rotator) -> |
|
|
|
gen_srv:start_link({local, ?MODULE}, ?MODULE, {Filename, MaxBytes, Size, Date, Count, Rotator}, []). |
|
|
|
start_link(Filename, MaxFmtSize, MaxFileSize, Date, Count, Rotator) -> |
|
|
|
gen_srv:start_link({local, ?MODULE}, ?MODULE, {Filename, MaxFmtSize, MaxFileSize, Date, Count, Rotator}, []). |
|
|
|
|
|
|
|
% File, MsgMaxBytes, RotationSize, RotationDate, RotationCount, RotationMod |
|
|
|
|
|
|
|
init({RelFilename, MaxBytes, Size, Date, Count, Rotator}) -> |
|
|
|
init({RelFilename, MaxFmtSize, MaxFileSize, Date, Count, Rotator}) -> |
|
|
|
Filename = rumUtil:parsePath(RelFilename), |
|
|
|
case Rotator:openLogFile(Filename, false) of |
|
|
|
{ok, {FD, Inode, Ctime, _Size}} -> |
|
|
|
schedule_rotation(Date), |
|
|
|
{ok, #state{fileName = Filename, fd = FD, inode = Inode, ctime = Ctime, fmtmaxbytes = MaxBytes, size = Size, count = Count, date = Date, rotator = Rotator}}; |
|
|
|
{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}}; |
|
|
|
{error, Reason} -> |
|
|
|
?INT_LOG(error, "Failed to open crash log file ~ts with error: ~s", |
|
|
|
[Filename, file:format_error(Reason)]), |
|
|
|
{ok, #state{fileName = Filename, fmtmaxbytes = MaxBytes, flap = true, size = Size, count = Count, date = Date, rotator = Rotator}} |
|
|
|
?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}} |
|
|
|
end. |
|
|
|
|
|
|
|
handleCall({log, _} = Log, State, _From) -> |
|
|
|
{Reply, NewState} = do_log(Log, State), |
|
|
|
handleCall({mWriteLog, Event}, State, _From) -> |
|
|
|
{Reply, NewState} = writeLog(Event, State), |
|
|
|
{reply, Reply, NewState}; |
|
|
|
handleCall(_Msg, _State, _From) -> |
|
|
|
?ERR("~p call receive unexpect msg ~p ~n ", [?MODULE, _Msg]), |
|
|
|
{reply, ok}. |
|
|
|
|
|
|
|
handleCast({log, _} = Log, State) -> |
|
|
|
{_, NewState} = do_log(Log, State), |
|
|
|
{noreply, NewState}; |
|
|
|
handleCast(_Msg, _State) -> |
|
|
|
?ERR("~p cast receive unexpect msg ~p ~n ", [?MODULE, _Msg]), |
|
|
|
kpS. |
|
|
|
|
|
|
|
handleInfo(rotate, #state{fileName = Name, count = Count, date = Date, rotator = Rotator}) -> |
|
|
|
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), |
|
|
|
schedule_rotation(Date), |
|
|
|
scheduleRotation(Date), |
|
|
|
kpS; |
|
|
|
handleInfo(_Msg, _State) -> |
|
|
|
?ERR("~p info receive unexpect msg ~p ~n ", [?MODULE, _Msg]), |
|
|
|
kpS. |
|
|
|
|
|
|
|
%% @private |
|
|
|
terminate(_Reason, _State) -> |
|
|
|
ok. |
|
|
|
|
|
|
|
%% @private |
|
|
|
code_change(_OldVsn, State, _Extra) -> |
|
|
|
{ok, State}. |
|
|
|
|
|
|
|
schedule_rotation(undefined) -> |
|
|
|
ok; |
|
|
|
schedule_rotation(Date) -> |
|
|
|
erlang:send_after(rumUtil:calculate_next_rotation(Date) * 1000, self(), rotate), |
|
|
|
scheduleRotation(undefined) -> ok; |
|
|
|
scheduleRotation(Date) -> |
|
|
|
erlang:send_after(rumUtil:calcNextRotate(Date) * 1000, self(), mRotate), |
|
|
|
ok. |
|
|
|
|
|
|
|
%% ===== Begin code lifted from riak_err ===== |
|
|
@ -167,8 +161,8 @@ sasl_limited_str(progress, Report, FmtMaxBytes) -> |
|
|
|
sasl_limited_str(crash_report, Report, FmtMaxBytes) -> |
|
|
|
rumStdlib:proc_lib_format(Report, FmtMaxBytes). |
|
|
|
|
|
|
|
do_log({log, Event}, #state{fileName = Name, fd = FD, inode = Inode, ctime = Ctime, flap = Flap, |
|
|
|
fmtmaxbytes = FmtMaxBytes, size = RotSize, count = Count, rotator = Rotator} = State) -> |
|
|
|
writeLog(Event, #state{fileName = Name, fd = FD, inode = Inode, ctime = Ctime, flap = Flap, |
|
|
|
maxFmtSize = FmtMaxBytes, maxFileSize = RotSize, count = Count, rotator = Rotator} = State) -> |
|
|
|
%% borrowed from riak_err |
|
|
|
{ReportStr, Pid, MsgStr, _ErrorP} = |
|
|
|
case Event of |
|
|
@ -187,7 +181,7 @@ do_log({log, Event}, #state{fileName = Name, fd = FD, inode = Inode, ctime = Cti |
|
|
|
case Rotator:ensureLogfile(Name, FD, Inode, Ctime, false) of |
|
|
|
{ok, {_FD, _Inode, _Ctime, Size}} when RotSize /= 0, Size > RotSize -> |
|
|
|
_ = Rotator:rotateLogfile(Name, Count), |
|
|
|
handleCast({log, Event}, State); |
|
|
|
handleCast({mWriteLog, Event}, State); |
|
|
|
{ok, {NewFD, NewInode, NewCtime, _Size}} -> |
|
|
|
TimeBinStr = rumUtil:msToBinStr(), |
|
|
|
Time = [TimeBinStr, " =", ReportStr, "====\n"], |
|
|
|