Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Credits for LordJashin about awesome logging ideas. Thanks mate! :)
- type
- TLog = record
- file_setting: record
- name, path, fileType: string;
- saveEvery: Integer;
- debugOnSave: Boolean;
- end;
- data: record
- dtFormat: string;
- count, size, increasement: Integer;
- message: TStrArray;
- end;
- end;
- function ReplaceEx(Text: string; FindStrs: TStrArray; ReplaceStr: string): string;
- var
- h, e, i, l, m, o, p: Integer;
- begin
- h := High(FindStrs);
- Result := Text;
- if ((Result <> '') and (h > -1)) then
- begin
- o := 1;
- e := Length(ReplaceStr);
- repeat
- l := 0;
- for i := 0 to h do
- begin
- p := PosEx(FindStrs[i], Result, o)
- case (p < 1) of
- True:
- begin
- Delete(FindStrs, i, 1);
- Dec(i);
- Dec(h);
- end;
- False:
- if ((l = 0) or (p < l)) then
- begin
- m := i;
- l := p;
- end;
- end;
- end;
- if (l > 0) then
- begin
- Delete(Result, l, Length(FindStrs[m]));
- Insert(ReplaceStr, Result, l);
- o := (l + e);
- end;
- until (l <= 0);
- end;
- end;
- function AddFileData(Path, str: string): Boolean;
- var
- f: Integer;
- s: string;
- begin
- try
- if FileExists(Path) then
- begin
- f := OpenFile(Path, False);
- try
- ReadFileString(f, s, FileSize(f));
- finally
- CloseFile(f);
- end;
- end;
- s := (s + str);
- f := RewriteFile(Path, False);
- try
- Result := WriteFileString(f, s);
- finally
- CloseFile(f);
- end;
- except
- Result := False;
- end;
- s := '';
- end;
- function LogEx(name, path, file_type: string; save_every: Integer; date_time_format: string; increasement: Integer): TLog;
- begin
- Result.file_setting.name := name;
- if (path <> '') then
- Result.file_setting.path := path
- else
- Result.file_setting.path := LogsPath;
- if (file_type <> '') then
- Result.file_setting.fileType := file_type
- else
- Result.file_setting.fileType := 'log';
- if (save_every > 0) then
- Result.file_setting.saveEvery := save_every
- else
- Result.file_setting.saveEvery := 500;
- if (date_time_format <> '') then
- Result.data.dtFormat := date_time_format
- else
- Result.data.dtFormat := 'dd/mm/yyyy ~ hh:nn:ss(:zzz)';
- if (increasement > 0) then
- Result.data.increasement := increasement
- else
- Result.data.increasement := 100;
- end;
- function Log(name, path: string): TLog;
- begin
- Result := LogEx(name, path, 'log', 0, '', 0);
- end;
- procedure ClearLog(var l: TLog);
- begin
- SetLength(l.data.message, 0);
- l.data.count := 0;
- if (l.data.increasement < 1) then
- l.data.increasement := 1;
- l.data.size := l.data.increasement;
- SetLength(l.data.message, l.data.size);
- end;
- function SaveLog(var l: TLog): Boolean;
- var
- i: Integer;
- s, p, n: string;
- begin
- if (l.data.count < 1) then
- Exit;
- p := (l.file_setting.path + l.file_setting.name + '.' + l.file_setting.fileType);
- if (GetFileSize(p) > 0) then
- n := #13#10;
- for i := 0 to (l.data.count - 1) do
- begin
- s := (s + l.data.message[i]);
- if (i < (l.data.count - 1)) then
- s := (s + #13#10);
- end;
- Result := AddFileData(p, (n + s));
- if Result then
- begin
- ClearLog(l);
- if l.file_setting.debugOnSave then
- WriteLn(s);
- end;
- s := '';
- end;
- procedure AddToLog(var l: TLog; event, data: string);
- var
- dt: string;
- begin
- DateTimeToString(dt, l.data.dtFormat, Now);
- if (l.data.count >= l.data.size) then
- begin
- if (l.data.increasement < 1) then
- l.data.increasement := 1;
- l.data.size := (l.data.count + l.data.increasement);
- SetLength(l.data.message, l.data.size);
- end;
- l.data.message[l.data.count] := ('[' + dt + '] ' + event + ' | ' + data);
- if (Pos(#13, l.data.message[l.data.count]) > 0) then
- l.data.message[l.data.count] := ReplaceEx(l.data.message[l.data.count], [#13#10, #13], ' ');
- Inc(l.data.count);
- if (l.data.count >= l.file_setting.saveEvery) then
- SaveLog(l);
- end;
- procedure DebugLog(l: TLog);
- var
- i: Integer;
- s, nl: string;
- begin
- if (l.data.count < 1) then
- Exit;
- nl := StringOfChar(' ', 2);
- for i := 0 to (l.data.count - 1) do
- begin
- s := (s + l.data.message[i]);
- if (i < (l.data.count - 1)) then
- s := (s + #13#10);
- end;
- WriteLn(s);
- s := '';
- end;
- var
- i: Integer;
- myLog: TLog;
- begin
- ClearDebug;
- myLog := Log('test', LogsPath);
- myLog.file_setting.debugOnSave := True;
- for i := 0 to 5000 do
- AddToLog(myLog, 'test(' + IntToStr(i) + ')', 'BLAH' + #13#10 'BLAAA!');
- i := GetSystemTime;
- SaveLog(myLog);
- Status(IntToStr(GetSystemTime - i) + ' ms.');
- end.
Advertisement
Add Comment
Please, Sign In to add comment