Janilabo

Janilabo | MSSL Log.scar [DEV]

Oct 13th, 2012
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 5.13 KB | None | 0 0
  1. // Credits for LordJashin about awesome logging ideas. Thanks mate! :)
  2.  
  3. type
  4.   TLog = record
  5.     file_setting: record                  
  6.       name, path, fileType: string;
  7.       saveEvery: Integer;
  8.       debugOnSave: Boolean;
  9.     end;
  10.     data: record                        
  11.       dtFormat: string;
  12.       count, size, increasement: Integer;
  13.       message: TStrArray;
  14.     end;
  15.   end;
  16.          
  17. function ReplaceEx(Text: string; FindStrs: TStrArray; ReplaceStr: string): string;
  18. var
  19.   h, e, i, l, m, o, p: Integer;
  20. begin
  21.   h := High(FindStrs);
  22.   Result := Text;
  23.   if ((Result <> '') and (h > -1)) then
  24.   begin          
  25.     o := 1;
  26.     e := Length(ReplaceStr);    
  27.     repeat    
  28.       l := 0;
  29.       for i := 0 to h do
  30.       begin
  31.         p := PosEx(FindStrs[i], Result, o)
  32.         case (p < 1) of
  33.           True:
  34.           begin
  35.             Delete(FindStrs, i, 1);
  36.             Dec(i);
  37.             Dec(h);
  38.           end;
  39.           False:
  40.           if ((l = 0) or (p < l)) then
  41.           begin    
  42.             m := i;
  43.             l := p;
  44.           end;
  45.         end;
  46.       end;
  47.       if (l > 0) then
  48.       begin
  49.         Delete(Result, l, Length(FindStrs[m]));
  50.         Insert(ReplaceStr, Result, l);
  51.         o := (l + e);
  52.       end;
  53.     until (l <= 0);
  54.   end;        
  55. end;
  56.  
  57. function AddFileData(Path, str: string): Boolean;
  58. var
  59.   f: Integer;
  60.   s: string;
  61. begin    
  62.   try
  63.     if FileExists(Path) then
  64.     begin
  65.       f := OpenFile(Path, False);
  66.       try
  67.         ReadFileString(f, s, FileSize(f));        
  68.       finally
  69.         CloseFile(f);
  70.       end;
  71.     end;    
  72.     s := (s + str);
  73.     f := RewriteFile(Path, False);
  74.     try
  75.       Result := WriteFileString(f, s);
  76.     finally
  77.       CloseFile(f);
  78.     end;  
  79.   except
  80.     Result := False;
  81.   end;
  82.   s := '';
  83. end;
  84.  
  85. function LogEx(name, path, file_type: string; save_every: Integer; date_time_format: string; increasement: Integer): TLog;
  86. begin
  87.   Result.file_setting.name := name;
  88.   if (path <> '') then
  89.     Result.file_setting.path := path
  90.   else
  91.     Result.file_setting.path := LogsPath;
  92.   if (file_type <> '') then
  93.     Result.file_setting.fileType := file_type
  94.   else
  95.     Result.file_setting.fileType := 'log';
  96.   if (save_every > 0) then
  97.     Result.file_setting.saveEvery := save_every
  98.   else
  99.     Result.file_setting.saveEvery := 500;
  100.   if (date_time_format <> '') then
  101.     Result.data.dtFormat := date_time_format
  102.   else
  103.     Result.data.dtFormat := 'dd/mm/yyyy ~ hh:nn:ss(:zzz)';
  104.   if (increasement > 0) then
  105.     Result.data.increasement := increasement
  106.   else
  107.     Result.data.increasement := 100;
  108. end;
  109.  
  110. function Log(name, path: string): TLog;
  111. begin
  112.   Result := LogEx(name, path, 'log', 0, '', 0);
  113. end;
  114.                                  
  115. procedure ClearLog(var l: TLog);
  116. begin
  117.   SetLength(l.data.message, 0);
  118.   l.data.count := 0;                
  119.   if (l.data.increasement < 1) then
  120.     l.data.increasement := 1;
  121.   l.data.size := l.data.increasement;  
  122.   SetLength(l.data.message, l.data.size);
  123. end;
  124.  
  125. function SaveLog(var l: TLog): Boolean;
  126. var
  127.   i: Integer;
  128.   s, p, n: string;
  129. begin
  130.   if (l.data.count < 1) then
  131.     Exit;
  132.   p := (l.file_setting.path + l.file_setting.name + '.' + l.file_setting.fileType);  
  133.   if (GetFileSize(p) > 0) then
  134.     n := #13#10;
  135.   for i := 0 to (l.data.count - 1) do
  136.   begin
  137.     s := (s + l.data.message[i]);
  138.     if (i < (l.data.count - 1)) then
  139.       s := (s + #13#10);
  140.   end;    
  141.   Result := AddFileData(p, (n + s));
  142.   if Result then      
  143.   begin
  144.     ClearLog(l);
  145.     if l.file_setting.debugOnSave then
  146.       WriteLn(s);
  147.   end;
  148.   s := '';
  149. end;
  150.  
  151. procedure AddToLog(var l: TLog; event, data: string);
  152. var
  153.   dt: string;                
  154. begin                                                  
  155.   DateTimeToString(dt, l.data.dtFormat, Now);
  156.   if (l.data.count >= l.data.size) then
  157.   begin                    
  158.     if (l.data.increasement < 1) then
  159.       l.data.increasement := 1;                      
  160.     l.data.size := (l.data.count + l.data.increasement);
  161.     SetLength(l.data.message, l.data.size);
  162.   end;                                                        
  163.   l.data.message[l.data.count] := ('[' + dt + '] ' + event + ' | ' + data);
  164.   if (Pos(#13, l.data.message[l.data.count]) > 0) then      
  165.     l.data.message[l.data.count] := ReplaceEx(l.data.message[l.data.count], [#13#10, #13], ' ');
  166.   Inc(l.data.count);
  167.   if (l.data.count >= l.file_setting.saveEvery) then
  168.     SaveLog(l);
  169. end;
  170.  
  171. procedure DebugLog(l: TLog);
  172. var
  173.   i: Integer;
  174.   s, nl: string;
  175. begin
  176.   if (l.data.count < 1) then
  177.     Exit;
  178.   nl := StringOfChar(' ', 2);
  179.   for i := 0 to (l.data.count - 1) do
  180.   begin
  181.     s := (s + l.data.message[i]);
  182.     if (i < (l.data.count - 1)) then
  183.       s := (s + #13#10);
  184.   end;                  
  185.   WriteLn(s);
  186.   s := '';
  187. end;
  188.  
  189. var
  190.   i: Integer;
  191.   myLog: TLog;
  192.  
  193. begin
  194.   ClearDebug;    
  195.   myLog := Log('test', LogsPath);
  196.   myLog.file_setting.debugOnSave := True;
  197.   for i := 0 to 5000 do
  198.     AddToLog(myLog, 'test(' + IntToStr(i) + ')', 'BLAH' + #13#10 'BLAAA!');
  199.   i := GetSystemTime;
  200.   SaveLog(myLog);
  201.   Status(IntToStr(GetSystemTime - i) + ' ms.');
  202. end.
Advertisement
Add Comment
Please, Sign In to add comment