Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

логер работы программы [D7, Win95/98, Win2k, WinXP]


Страницы:   1 2

jao ©   (2004-08-03 10:55:00) 

Логи работы программы записываются в Memo1:TMemo, приблизительно раз в сто строк (в зависимости от количества строк на экане) логи
скидываются в файл на диск (если файла лога нет - он создается, если есть - дописывается в конец). Программа работает круглосуточно и несколько раз в сутки вылетает сообщение о том, что файл лога не доступен или заблокирован другой программой, хотя никто кроме этой проги его не юзает.

Как можно обойти данную траблу или как можно сделать логер по-другому? кто нает :(

-----------------------------------------------------------
procedure TFormMD.Memo1Change(Sender: TObject);
var
 CountSaveLines:integer;
 fs:TFileStream;
 LogName:string;
 i:integer;
 m:word;
 TempStrings:TStringList;
 WasOpenError:boolean;

begin
   WasOpenError:=false;

   if memo1.Lines.Count>100 then
   begin
     LogName:=extractfilepath(application.ExeName)+'Logs\'+formatdatetime('dd_mm_yyyy', now)+'_'+inttostr(LogIndex)+'.log';

     if fileExists(LogName)
     then
     begin
       m:=fmOpenReadWrite
     end
     else
     begin
       m:=fmCreate;
     end;

     fs:=TFileStream.Create(LogName,m);

     fs.Seek(0, soFromEnd);

     TempStrings:=TStringList.Create;
     TempStrings.BeginUpdate;

     memo1.Lines.BeginUpdate;
     CountSaveLines:=memo1.Height div (memo1.Font.Height - 3);

     for i:=0 to 100+(CountSaveLines) do
     begin
       TempStrings.Add(memo1.Lines.Strings[0]);
       memo1.Lines.Delete(0);
     end;

     TempStrings.SaveToStream(fs);

     memo1.Lines.EndUpdate;
     TempStrings.EndUpdate;
     TempStrings.Free;

     fs.Free;
   end;
end;
------------------------------------------------


panov   (2004-08-03 12:13:00) [21]

Журнал можно просматривать во время работы программы...


panov   (2004-08-03 12:12:00) [22]

http://home.ural.ru/~panov/dll_src/new/readme.txt
Тут есть реализованный журнал в DLL и отдельном потоке.


TUser   (2004-08-03 11:53:00) [23]

Сразу в файл можно записыватьчерез FileStream методом Write. Строки записываются посимвольно, перед каждой строкой - Integer значение (дляна строки). См. статьи А.Подгорецкого на Королевстве, + любая другая литература по Delphi.


Erik1   (2004-08-03 11:47:00) [24]

Однозначно лучше писать сразу в фаил. TFileSteream можно неиспользовать, тогда и уничтожать ненадо. А паралельно можно выводить в лог.
procedure TRealEvent.Close;
begin
 FileActive := False;
 {$I-}
 Flush(F);
 CloseFile(F);
 {$I+}
end;

procedure TRealEvent.Log;
Var Buf: String;
Const LogFile =  'C:\UDPLog.txt';
begin
 Buf := Format('%d;%d;%d;%d;',[DecNoToInt(Params.Decoder),Params.Cmd,
   fConf.Code, fConf.Content]);

 if not FileActive then begin
   AssignFile(F,LogFile);
   {$I-}
   Reset(F);
   {$I+}
   IOResult;
   if Not FileExists(LogFile) then
     Rewrite(F);

   FileActive := True;
 end;

 Append(F);
 Writeln(F,Buf);
end;


jao   (2004-08-03 11:45:00) [25]

>Кириешки
Приведи, плз, пример того каким способом ты пишешь сразу в файл

ЗЫ: А не будет ли это сильно тормозить систему и постоянно грузить диск?


TUser   (2004-08-03 11:40:00) [26]

Программа просматривает фалы на ftp сервере. Файлы организованы в большое кол-во папок. Для каждой папки - свой лог.


jao   (2004-08-03 11:39:00) [27]

>TUser

Если делать Clear, то юзверь не увидит последних записей, а это есь плохо, попробую try ... finally, хотя вроде там нет опасных участков, где может быть эксепшн...вот бы научиться разблокировать заблокированный файл :)))


Кириешки   (2004-08-03 11:38:00) [28]

>TUser ©   (03.08.04 11:30) [3]

А для чего большое кол-во файлов надо, в которых лог пишется?
Обычно лог делается суточный или несколькочасовой, а зетем новый файл делается.


TUser   (2004-08-03 11:30:00) [29]

Не всегда это проще. У меня сейчас вот работает прога, которая логи ведет, записывается в файл и мему. Очень удобно сразу видеть чего она пишет. Делал примерно так
procedure AddToLog(S:string);
begin
  Memo1.Lines.Add;
  if assigned(FLog) then
     {пишем S В FLog}  
end;

procedure NewLog;
begin
  if assigned(FLog);
  then Freeandnil(FLog);
  FLog:=TFileSteream.Create;
end;
Правда у меня лог организован в виде большого кол-ва файлов, после открытия каждый закрывается минут через 30-40.


Кириешки   (2004-08-03 11:25:00) [30]

А не проще писать сразу в файл? Для этого есть функция Append, она записывает "что-то" в конец файла. Я так делал, когда уезжал в Крым, а за моим компом оставались люди. Она тоже "круглосуточно" работала. А потом приехал и почитав файл узнал что они делали на компе в мое отсутствие. Правда файл - большой-большой был 20 мегов. Его доже Ворд грузить отказался (сказав что стек переполнен). Пришлось частями грузить.


TUser   (2004-08-03 11:04:00) [31]

TempStrings.BeginUpdate;

    memo1.Lines.BeginUpdate;
    CountSaveLines:=memo1.Height div (memo1.Font.Height - 3);

Вот этот участок кода точно нуждается в переписывании. И Memo1.Lines.Delete[0] - не самая быстрая операция, лучше потом сделать ему Clear. Переписать здесь надо много.
А вообще может статься, например, что где-то происходит ошибка, FileStream не уничтожается, поэтому файл оказывается занятым. Это первое, что в голову пришло. Вообще, всегда лучше писать try ... finally, если надо, чтобы объект гарантированно уничтожался.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо