Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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)

Ну если электричество отключить - может и не запишется, что ты скажешь о функции 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.046 c
2-1170935968
Medved_
2007-02-08 14:59
2007.02.25
Com


15-1170409028
мжмж
2007-02-02 12:37
2007.02.25
Может не сюда, но все же..


4-1160674602
alexold
2006-10-12 21:36
2007.02.25
Чтение файла размером больше 2 Гбайт


2-1170756864
Cara
2007-02-06 13:14
2007.02.25
ADOConnection и Acceess


2-1170765318
фыфвфы
2007-02-06 15:35
2007.02.25
свойства папки





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский