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

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

Логи


Страницы:   1 2

Strate ©   (2007-02-02 11:05:00) 

Здравствуйте.

Имеется программа, в результате которой должен появиться лог того, что она сделала. Лог может быть очень большим, и он постоянно пополняется в ходе работы. Программа по задумке включенна постоянно.

Как организовать запись в лог, чтобы:

1) Не грузило систему
2) Файл оставался доступным для чтения из других программ?

Пробовал варианты с TFileStream и TextFiles, но при постоянном открытии/заурытии про каждой строчке лога тормоза. Может есть ещё способ?

Спасибо.


clickmaker   (2007-02-05 09:53:00) [1]


>  [19] Джо ©   (03.02.07 06:05)
> > [18] Kedge ©   (03.02.07 05:43)
> > А почему он должен исчезнуть ?
>
> Не должен, конечно. Но исчезнет. Из-за кеширования дисковой
> записи в памяти, например

CreateFile(PChar(LogFilePath), GENERIC_READ or GENERIC_WRITE,
                       FILE_SHARE_READ, nil, OPEN_ALWAYS, FILE_FLAG_WRITE_THROUGH, 0);


novill   (2007-02-05 09:10:00) [2]

> [19] Джо ©   (03.02.07 06:05)

Ну если электричество отключить - может и не запишется, что ты скажешь о функции Flush

When a text file is opened for output using Rewrite or Append, Flush empties the file's buffer. This guarantees that all characters written to the file at that time have actually been written to the external file.


Kedge   (2007-02-04 06:14:00) [3]

>[19] Джо ©   (03.02.07 06:05)
Спасибо.


Джо   (2007-02-03 06:05:00) [4]

> [18] Kedge ©   (03.02.07 05:43)
> А почему он должен исчезнуть ?

Не должен, конечно. Но исчезнет. Из-за кеширования дисковой записи в памяти, например.


Kedge   (2007-02-03 05:43:00) [5]

> [16] Плохиш ©   (02.02.07 16:38)
> > Файл не надо переоткрывать каждый раз - в начале проги открыл,
> >  в конце закрыл.
> Нафига нужен лог, который при сбое/аварийном вылете программы
> доже исчезнет?

А почему он должен исчезнуть ?


Strate   (2007-02-02 16:44:00) [6]

clickmaker ©   (02.02.07 14:36) [14]

Спасибо, будем пробовать.


Плохиш   (2007-02-02 16:38:00) [7]


> Файл не надо переоткрывать каждый раз - в начале проги открыл,
>  в конце закрыл.

Нафига нужен лог, который при сбое/аварийном вылете программы доже исчезнет?


novill   (2007-02-02 15:09:00) [8]

> [13] JFK&MM_extramarital_son   (02.02.07 14:15)

Лучше он от этого не стал :)


clickmaker   (2007-02-02 14:36:00) [9]

procedure LogAction(const Msg: string);
var
 dwBytesWritten: Cardinal;
 DateStr, MsgText: string;
begin
 LogSection.Enter; // если лог ведется из нескольких потоков
 try
   DateTimeToString(DateStr, 'dd.mm.yy hh:nn:ss.zzz', Now);
   MsgText := Format('%s'#9'%d'#9'#9'%s'#13#10, [DateStr, GetCurrentThreadID, Msg]);
   WriteFile(hLogFile, MsgText[1], Length(MsgText), dwBytesWritten, nil);
 finally
   LogSection.Leave;
 end;    
end;

procedure StartLogging;
begin
 LogSection := TCriticalSection.Create;
 hLogFile := CreateFile(PChar(LogFilePath), GENERIC_READ or GENERIC_WRITE,
                        FILE_SHARE_READ, nil, OPEN_ALWAYS, 0, 0);
 SetFilePointer(hLogFile, 0, nil, FILE_END);
end;

procedure StopLogging;
begin
 CloseHandle(hLogFile);
 LogSection.Free;
end;


JFK&MM_extramarital_son   (2007-02-02 14:15:00) [10]

Я этим "плохим" советом уже лет сто пользуюсь.


novill   (2007-02-02 14:09:00) [11]

> [11] JFK&MM_extramarital_son   (02.02.07 12:41)

Плохой совет.

Файл не надо переоткрывать каждый раз - в начале проги открыл, в конце закрыл.

Если хочешь быть уверенным что записалось, делай flush.


JFK&MM_extramarital_son   (2007-02-02 12:41:00) [12]

unit LogUnit;

interface

procedure Log(const AMsg : string; const AParam : string = '');

implementation

uses Classes, SysUtils;

var LogName : string;

procedure Log(const AMsg : string; const AParam : string = '');
var F:Text;
begin
Assign(F,LogName);
try
 if FileExists(LogName) then Append(F) else Rewrite(F);
 Writeln(F,FormatDateTime('dd.mm.yyyy hh:mm:ss',Now),#9,AMsg,#9,AParam);
finally
 Close(F);
end;
end;

initialization
LogName:=ChangeFileExt(ParamStr(0),'.log');
end.


Если приложение многопоточное, добавить CritiaclSections по вкусу.


iXT   (2007-02-02 12:31:00) [13]


> DrPass ©   (02.02.07 12:29) [9]

Согласен.


DrPass   (2007-02-02 12:29:00) [14]


> Чтобы его могли видить другие (для чтения), после записи
> в файл тебе надо его закрывать

Зачем? Не надо ничего закрывать, просто файл не стоит монопольно лочить


Anatoly Podgoretsky   (2007-02-02 12:06:00) [15]

> Strate  (02.02.2007 11:13:02)  [2]

При таких объемах пора на базу переходить.
А тормоза, ну так наверно не так написано.


Комбинатор   (2007-02-02 11:26:00) [16]


> Имеется программа, в результате которой должен появиться
> лог того, что она сделала


Программа сама делает или кто-то делает с её помощью?


Elen   (2007-02-02 11:25:00) [17]


> Дурдом, а не лог...

Наверное Войну и мир в логи бацает :)


iXT   (2007-02-02 11:22:00) [18]

Да хоть 100
Чтобы его могли видить другие (для чтения), после записи в файл тебе надо его закрывать. Каким образом ты будешь писать в файл (Streem или AssignFile), не имеет значение.
Тут тебе следует скорее подумать о структуре лога. Чтобы файл не был слишком огромным возможно писать в разные файлы (менять их) каждый час.
10*60*60=36000 - за час. Не очень то удобно по нему потом искать что-либо.


Плохиш   (2007-02-02 11:21:00) [19]


> а вот если 10 штук в секунду появилось

Дурдом, а не лог... Сохраняй в стринглист и скидывай в файл периодически.


novill   (2007-02-02 11:15:00) [20]

> [2] Strate ©   (02.02.07 11:13)

код в студию!


Страницы:   1 2

Наверх

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