Форум: "Начинающим";
Текущий архив: 2007.02.25;
Скачать: [xml.tar.bz2];
ВнизЛоги Найти похожие ветки
← →
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)
Ну если электричество отключить - может и не запишется, что ты скажешь о функции FlushWhen 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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.046 c