Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.05.06;
Скачать: CL | DM;

Вниз

Как правильно вести лог событий работы программы?   Найти похожие ветки 

 
Ezorcist   (2007-04-15 01:07) [0]

Можно в начале работы программы обращаться к текстовому файлу
assignfile(f,"log.txt);
а потом при каждом событии, которое необходимо записать в лог делать соотв. запись в файл:
writeln(f,str);
А в коне программы закрывать файл closefile(f);

Но если программы будет завершена неверно (т.е. как следствие не будет выполнено closefile(f); ), то часть данных, как я понял может потеряться.

Как предотвратить потерю этих данных или же можно вести лог другим более правильным способом?


 
Германн ©   (2007-04-15 01:15) [1]


> Ezorcist   (15.04.07 01:07)
>
> Можно в начале работы программы обращаться к текстовому
> файлу
> assignfile(f,"log.txt);
> а потом при каждом событии, которое необходимо записать
> в лог делать соотв. запись в файл:
> writeln(f,str);
> А в коне программы закрывать файл closefile(f);
>
> Но если программы будет завершена неверно (т.е. как следствие
> не будет выполнено closefile(f); ), то часть данных, как
> я понял может потеряться.
>
> Как предотвратить потерю этих данных или же можно вести
> лог другим более правильным способом?
>

AssignFile тут вообще ни при чём. Имеют значение только Reset, Rewrite, Append & CloseFile.


 
Джо ©   (2007-04-15 03:39) [2]

> [0] Ezorcist   (15.04.07 01:07)
> Как предотвратить потерю этих данных или же можно вести
> лог другим более правильным способом?

Можно, например, закрывать файл после каждой записи и открывать снова, когда нужно. Можно, например, делать принудительный Flush. Да мало ли чего еще можно, например.


 
Плохиш ©   (2007-04-15 04:20) [3]


> Ezorcist   (15.04.07 01:07)  

Нннаа, ик... дарю...ик

type
 TLogFile = class
   FFileName:  String;
   FLogBuf:    TStrings;

   public
     constructor Create(AFileName: String = "");
     destructor  Destroy; override;
     procedure   Add(AStrLog: String); virtual;
     procedure   AddStr(AStrLog: String); virtual;
     procedure   AddValue(AName: String; AValue: Variant; AOhneTime: Boolean = false); virtual;
     procedure   AddDynArr(AName: String; AValue: TByteDynArray; AOhneTime: Boolean = false); overload;
     procedure   AddDynArr(AName: String; AValue: TShortIntDynArray; AOhneTime: Boolean = false); overload;
     procedure   Save; virtual;
     property    LogBuf: TStrings read FLogBuf;
 end;
....
{ TLogFile }

procedure TLogFile.Add(AStrLog: String);
begin
 FLogBuf.Add(FormatDateTime(""["dd/mm/yyyy" - "hh:nn:ss"] "", now) + AStrLog);
end;

procedure TLogFile.AddStr(AStrLog: String);
begin
 FLogBuf.Add(AStrLog);
end;

procedure TLogFile.AddValue(AName: String; AValue: Variant; AOhneTime: Boolean);
var
   sValue: String;
begin
 sValue := VarToStr(AValue);
 sValue := AName + " = " + sValue;
 if AOhneTime then AddStr(sValue) else Add(sValue);
end;

procedure TLogFile.AddDynArr(AName: String; AValue: TByteDynArray;
 AOhneTime: Boolean);
var
   sValue: String;
   lIndex: Integer;
begin
 sValue := "";
 for lIndex := Low(AValue) to High(AValue) do
   sValue := sValue + chr(AValue[lIndex]);
 sValue := AName + " = " + sValue;
 if AOhneTime then AddStr(sValue) else Add(sValue);
end;

procedure TLogFile.AddDynArr(AName: String; AValue: TShortIntDynArray;
 AOhneTime: Boolean);
var
   sValue: String;
   lIndex: Integer;
begin
 sValue := "";
 for lIndex := Low(AValue) to High(AValue) do
   sValue := sValue + chr(byte(AValue[lIndex]));
 sValue := AName + " = " + sValue;
 if AOhneTime then AddStr(sValue) else Add(sValue);
end;

constructor TLogFile.Create(AFileName: String);
begin
 inherited Create;
 if AFileName = "" then  FFileName := cLogFile
 else if ExtractFilePath(AFileName) <> "" then FFileName := AFileName
 else
{$IFDEF MSWINDOWS}
   FFileName := IncludeTrailingPathDelimiter(GetEnvironmentVariable("temp")) + AFileName;
{$ENDIF}
{$IFDEF LINUX}
   FFileName := "/tmp/" + AFileName;
{$ENDIF}
 FLogBuf := TStringList.Create;
 TStringList(FLogBuf).Sorted := false;
end;

destructor TLogFile.Destroy;
begin
 if FLogBuf.Count > 0 then Save;
 FLogBuf.Free;
 inherited;
end;

procedure TLogFile.Save;
var
   FOut:     TStream;
   bCreated: Boolean;
begin
 bCreated := false;
 FOut := nil;
 if not FileExists(FFileName) then
   FOut := TFileStream.Create(FFileName, fmCreate)
 else
   repeat
     try
       FOut := TFileStream.Create(FFileName, fmOpenReadWrite + fmShareExclusive);
       bCreated := true;
     except
       on EFOpenError do Sleep(500)
       else raise;
     end;
   until bCreated;
 try
   FOut.Seek(0, soFromEnd);
   FLogBuf.SaveToStream(FOut);
   FLogBuf.Clear;
 finally
   Fout.Free;
 end;
end;


 
Ezorcist   (2007-04-15 11:15) [4]


> лохиш ©   (15.04.07 04:20) [3]
>
>
> > Ezorcist   (15.04.07 01:07)  
>
> Нннаа, ик... дарю...ик


Мамма-мия )) СПАСИБО!)



Страницы: 1 вся ветка

Текущий архив: 2007.05.06;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.019 c
1-1173691841
greg123
2007-03-12 12:30
2007.05.06
Как определить какие формы приложения открыты


2-1176815726
ppcumax
2007-04-17 17:15
2007.05.06
Как удалить первую строку из Memo?


15-1176086186
Slider007
2007-04-09 06:36
2007.05.06
С днем рождения ! 7 апреля


15-1176117920
Andre_s
2007-04-09 15:25
2007.05.06
Плата видеонаблюдения...


2-1176446453
Бульбаш
2007-04-13 10:40
2007.05.06
Проблема с запуском софта