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

Вниз

Логи   Найти похожие ветки 

 
Strate ©   (2007-02-02 11:05) [0]

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

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

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

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

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

Спасибо.


 
Elen ©   (2007-02-02 11:10) [1]


> но при постоянном открытии/заурытии про каждой строчке лога
> тормоза

Тормоза??? При Append...Write...Close тоже ???


 
Strate ©   (2007-02-02 11:13) [2]

Ну если конечно строчка лога появляется допустим раз в час то нормально, а вот если 10 штук в секунду появилось...


 
novill ©   (2007-02-02 11:15) [3]

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

код в студию!


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


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

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


 
iXT ©   (2007-02-02 11:22) [5]

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


 
Elen ©   (2007-02-02 11:25) [6]


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

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


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


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


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


 
Anatoly Podgoretsky ©   (2007-02-02 12:06) [8]

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

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


 
DrPass ©   (2007-02-02 12:29) [9]


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

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


 
iXT ©   (2007-02-02 12:31) [10]


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

Согласен.


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

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 по вкусу.


 
novill ©   (2007-02-02 14:09) [12]

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

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

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

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


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

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


 
clickmaker ©   (2007-02-02 14:36) [14]

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;


 
novill ©   (2007-02-02 15:09) [15]

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

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


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


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

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


 
Strate ©   (2007-02-02 16:44) [17]

clickmaker ©   (02.02.07 14:36) [14]

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


 
Kedge ©   (2007-02-03 05:43) [18]

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

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


 
Джо ©   (2007-02-03 06:05) [19]

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

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


 
Kedge ©   (2007-02-04 06:14) [20]

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


 
novill ©   (2007-02-05 09:10) [21]

> [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.


 
clickmaker ©   (2007-02-05 09:53) [22]


>  [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);



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

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

Наверх




Память: 0.52 MB
Время: 0.041 c
2-1170760534
seesm
2007-02-06 14:15
2007.02.25
Я не знаю asm


1-1167327617
guitarist
2006-12-28 20:40
2007.02.25
Поиск строки в большом файле


2-1170748728
Клара
2007-02-06 10:58
2007.02.25
Запросы


2-1170273176
valwin
2007-01-31 22:52
2007.02.25
Отрисовка маленького примитива на канве с учётом угла поворота!


15-1170186235
Kerk
2007-01-30 22:43
2007.02.25
ФСБ просит решить проблему орфографии