Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.07.27;
Скачать: [xml.tar.bz2];

Вниз

Работа с логами   Найти похожие ветки 

 
123-ий ©   (2008-06-25 11:36) [0]

Как лучше организовать сабж? В том смысле, какими методами его лучше читать и писАть в него каку-либо инфу?


 
Palladin ©   (2008-06-25 11:38) [1]

какими тебе удобно


 
Ega23 ©   (2008-06-25 11:39) [2]

Ну вот некая заготовочка, в данный момент в процессе "затачивания"


unit uLogger;

interface
uses SysUtils;

function LogError(const Err : string) : Boolean;
function Log(const LogMess : string) : Boolean;
function LogTo(const Name : string; const LogMess : string) : Boolean;
function LogWithError(const Err : string) : Boolean;
function LogToFile(const FileName, LogMess : string;
                  const WriteTime : Boolean = False) : Boolean;

implementation

//*****************************************************************************

function LogWithError(const Err : string) : Boolean;
begin
 Result := LogError(Err) and Log(Err);
end;

//*****************************************************************************

function LogError(const Err : string) : Boolean;
begin
 Result := LogTo("SLErrLog", Err);
end;

//*****************************************************************************

function Log(const LogMess : string) : Boolean;
begin
 Result := LogTo("SLLog", LogMess);
end;

//*****************************************************************************

function LogTo(const Name : string; const LogMess : string) : Boolean;
var
 DirName, LogFileName : string;
 f : TextFile;
begin
 Result := True;
 DirName := ExtractFilePath(ParamStr(0)) + "Log\";
 LogFileName := DirName + Name + "_" + FormatdateTime("yyyy-mm-dd", Now) + ".log";
 if not DirectoryExists(DirName) then
 begin
   Result := CreateDir(DirName);
   if not Result then Exit;
 end;
 AssignFile(f, LogFileName);
 try
   try
     if not FileExists(LogFileName) then
       Rewrite(f)
     else
       Append(f);
     Writeln(f, FormatDateTime("dd.mm.yyyy hh:nn:ss", Now) + " : " + LogMess);
   except
     Result := False;
   end;
 finally
   CloseFile(f);
 end;
end;

//*****************************************************************************

function LogToFile(const FileName, LogMess : string; const WriteTime : Boolean) : Boolean;
var
 f : TextFile;
begin
 AssignFile(f, FileName);
 try
   try
     if not FileExists(FileName) then
       Rewrite(f)
     else
       Append(f);
     if WriteTime then
       Writeln(f, FormatDateTime("dd.mm.yyyy hh:nn:ss", Now) + " : " + LogMess)
     else
       Writeln(f, LogMess);
     Result := True;
   except
     begin
       Result := False;
       Exit;
     end;
   end;
 finally
   CloseFile(f);
 end;
end;

//*****************************************************************************
end.



 
clickmaker ©   (2008-06-25 11:39) [3]

CreateFile - WriteFile - CloseHandle
для ускорения можно открыть один раз и закрыть один раз, но если нужен постоянный монитор лога, то периодически делать FlushFileBuffers.
При записи из нескольких потоков оберни запись в критическую секцию


 
123-ий ©   (2008-06-25 11:47) [4]


> Ega23 ©   (25.06.08 11:39) [2]

Вот этот вариант - с помощью TextFile. Делал с помощью него, частенько вылезают глюки, типа файл занят другим приложением. Как вариант было - читать файл с помощью потоков TFileStream. Ещё не пробовал. А был вариант с помощью StringList.LoadFromFile. Работал. Так вот интересно, какой вариант наиболее оптимальный?


 
123-ий ©   (2008-06-25 11:49) [5]


> clickmaker ©   (25.06.08 11:39) [3]

постоянный монитор не нужен. ускорение тоже, ибо лог... ну у меня не совсем лог, скорее история работы с клиентом, там вряд ли будет дофига инфы.


 
stas ©   (2008-06-25 11:58) [6]

У меня такой работает на многопоточном сервере, еще не разу не глючил.
Только при запуске проги делаем CreateLogFile, по завершении CloseFile
лог пишем WriteLog

unit LogWriter;

interface
uses sysutils;
Procedure OpenFile (FileName:String);
Procedure CloseFile;
Procedure WriteText (Text:String);
Procedure CreateLogFile;
Procedure WriteLog (Text:String);
//Procedure SetWritedLog (Writed:Boolean);

Var F:TextFile; WritedLog:Boolean=True;

implementation

Procedure OpenFile (FileName:String);
begin
//  if not writedLog then exit;
 Assign (F,FileName);
 if FileExists (FileNAme) then
 Reset (F); {else} Rewrite (f);
end;

Procedure CloseFile;
begin
 Close (F);
end;

Procedure WriteText (Text:String);
begin
 if writedLog then
 Writeln (F,Text);
end;

Procedure CreateLogFile;
Var fp,FName,fn:String; I:Integer;
begin
  fp:=ExtractFilePath(ParamStr(0))+"logs\";
  if not DirectoryExists (fp) then MkDir (fp);
  FName:=fp+"gsLog_"+FormatDateTime ("ddmmyyyy",now);
  i:=0;
  fn:= FName;
  While FileExists (FName) do
  begin
   FName:=FN+IntToStr(i);
   inc(i);
  end;
  OpenFile (FName);
end;

Procedure WriteLog (Text:String);
Var S:String;
begin
S:=FormatDateTime ("ddmmyyyy hh:mm:ss",now)+": "+Text;
try
WriteText(S);
except
end;
end;

end.


 
123-ий ©   (2008-06-25 11:59) [7]

ну вот попробую варианты Ega32 и stas. Может чего и выйдет умного...


 
Ega23 ©   (2008-06-25 12:00) [8]


> работает на многопоточном сервере,


А где критическая секция?


 
Ega23 ©   (2008-06-25 12:01) [9]


> варианты Ega32


Эй! Ты смотри, это всего только заготовка...  :) Её ещё тщательно "напильником" обрабатывать надо...  :)


 
stas ©   (2008-06-25 12:03) [10]

Ega23 ©   (25.06.08 12:00) [8]
try except ?


 
Ega23 ©   (2008-06-25 12:05) [11]


> try except ?


На сколько я понимаю, для реально многопоточного лога этого недостаточно...


 
stas ©   (2008-06-25 12:07) [12]

Ega23 ©   (25.06.08 12:05) [11]
тогда что вы имеете ввиду?


 
Ega23 ©   (2008-06-25 12:12) [13]

EnterCriticalSection
try
 try
   ....
   WriteLog
 except
   ....
 end;
finally
 LeaveCriticalSection
end;


 
stas ©   (2008-06-25 12:19) [14]

Ega23 ©   (25.06.08 12:12) [13]

Не слышал. А это для чего.

Пока у меня не возникало никаких проблем слогом сервер работает в течении года.
Но если это чему-то поможет буду благодарен.


 
Ega23 ©   (2008-06-25 12:24) [15]


> А это для чего.


Ну как же. 2 потока разом пытаются в файл что-то записать...


 
123-ий ©   (2008-06-25 12:35) [16]


> Ega23 ©   (25.06.08 12:01) [9]

Ну вот. У тебя получилась хорошая защита от копипастинга. Конечно я постараюсь разобраться в смысле кода, а потом уже и напильником и шкуркой. По любому рахмет, ой это ж по казахски... спасибо :)


 
Ega23 ©   (2008-06-25 12:38) [17]


> У тебя получилась хорошая защита от копипастинга.


Не, можно конечно брать и пользоваться, но я это дело "под себя" точил. Тебе может всего и не нужно совсем.


 
123-ий ©   (2008-06-25 12:54) [18]

Панятно. будем разбираться :)


 
Loginov Dmitry ©   (2008-06-25 12:59) [19]


> Как лучше организовать сабж? В том смысле, какими методами
> его лучше читать и писАть в него каку-либо инфу?


Пример надежной записи в лог здесь:
http://matrix.kladovka.net.ru/download.php?getfilename=uploads/other/ldslogger.zip


 
stas ©   (2008-06-25 13:01) [20]

Ega23 ©   (25.06.08 12:24) [15]
пишут, ошибка не возникает. O_O.
Ок, попытаюсь разобраться.


 
stas ©   (2008-06-25 13:22) [21]

Ega23 ©   (25.06.08 12:24) [15]
возникала такая ошибка когда я вyenhb функции LogWrite, открывал потом закрывал файл, когда сделал f глобальной переменной и открываю файл один раз, эти проблемы ушли.


 
Игорь Шевченко ©   (2008-06-25 13:29) [22]


> Эй! Ты смотри, это всего только заготовка...  :) Её ещё
> тщательно "напильником" обрабатывать надо...  :)


точнее выкинуть


 
123-ий ©   (2008-06-26 07:54) [23]


> Игорь Шевченко ©   (25.06.08 13:29) [22]

а что так невесело?


 
123-ий ©   (2008-06-26 10:50) [24]


> Ega23 ©   (25.06.08 11:39) [2]
а чтение лога? у тебя ж только запись... или ты чтение вообще не делал
?


 
Ega23 ©   (2008-06-26 10:54) [25]


> или ты чтение вообще не делал


А нафига мне чтение??? Если чё, мне заказчик этот лог вышлет. А я уже там сам в блокноте разберусь...  :)))


 
Игорь Шевченко ©   (2008-06-26 21:01) [26]


> а что так невесело?


сам посмотри на код


 
Германн ©   (2008-06-26 21:34) [27]

4 года назад тут Панов выкладывал код для ведения лога на ~400 строк кода.
:-)


 
123-ий ©   (2008-06-27 08:29) [28]

фигасе. А мне чтение нужно шобы в программу содержимое выводить. Лана, буду сам додумывать. :)


 
Anatoly Podgoretsky ©   (2008-06-27 08:38) [29]


> 4 года назад тут Панов выкладывал код для ведения лога на
> ~400 строк кода.

Он схалтурил, ему лень было полный код писать.


 
@!!ex ©   (2008-06-27 09:28) [30]

Я один такой не модный, что у меня 10 строчек логирование? :\
Оно правда на С++, но ниче умного нет на дельфи переделать. Работает мгновенно, даже если сообщения валятся пачками.

static osal::cFile* s_Log;

void loger::Init(const std::string FileName)
{
s_Log = new osal::cFile(FileName,osal::WRITE);
};

void loger::Finish()
{
delete s_Log;
};

void loger::Add(const std::string Text)
{
osal::PrintInConsole(Text+"\n");
s_Log->WriteText(Text);
s_Log->Flush();
};


 
@!!ex ©   (2008-06-27 09:28) [31]

правда тут не многопоточное действо.


 
Поросенок Винни-Пух ©   (2008-06-27 09:36) [32]

unit LogUnit;

interface

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

implementation

uses Classes, SysUtils,SyncObjs;

var LogName:string;
   cs : TCriticalSection = nil;

procedure Log(const AMsg : string; const AParam : string = "");
var F:Text;
begin
cs.Enter;
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);
 cs.Leave;
end;
end;

initialization
cs := TCriticalSection.Create;
LogName:=ChangeFileExt(ParamStr(0),".log");
finalization
cs.Free;
end.


 
Тын-Дын ©   (2008-06-27 11:08) [33]

А во всех этих пример и реализациях нагрузочное многопоточное тестирование проводилось?


 
Поросенок Винни-Пух ©   (2008-06-27 11:09) [34]

не только тестирование, но и многолетняя эксплуатация


 
Тын-Дын ©   (2008-06-27 11:26) [35]


> Поросенок Винни-Пух ©   (27.06.08 11:09) [34]
> не только тестирование, но и многолетняя эксплуатация


Ну и как с нагрузкой?
Сколько записей в секунду выдерживает и время реакции(время начала/конца обращения к процедуре?).


 
Поросенок Винни-Пух ©   (2008-06-27 11:30) [36]

Сколько записей в секунду выдерживает

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


 
Тын-Дын ©   (2008-06-27 11:32) [37]


> Поросенок Винни-Пух ©   (27.06.08 11:30) [36]
> Сколько записей в секунду выдерживает
>
> это важно, если стоит задача быстрого наполнения лога все
> равно чем.


Неверно.
Есть задачи с большим потоком обработки данных, и операции нужно протоколировать, не мешая основной задаче.
Это и есть прямое назначение.


 
Поросенок Винни-Пух ©   (2008-06-27 11:33) [38]

в одном из фрагментов сегодняшнего лога нашел 21 запись в течении одной секунды. наверное было бы больше, если бы логируемая операция содержала больше шагов.


 
Поросенок Винни-Пух ©   (2008-06-27 11:34) [39]

У меня не мешает.


 
Поросенок Винни-Пух ©   (2008-06-27 11:36) [40]

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


И каким образом спрошенное у меня количество записей в секунду может что-то сказать про это?



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

Форум: "Начинающим";
Текущий архив: 2008.07.27;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.009 c
15-1212964470
axis_of_evil
2008-06-09 02:34
2008.07.27
proxy server, mail server


15-1212943505
Alexey
2008-06-08 20:45
2008.07.27
Организация доступа к данным


15-1212964953
Поросенок Винни-Пух
2008-06-09 02:42
2008.07.27
Возвращаясь к неименованным пайпам


2-1214304266
Голденко
2008-06-24 14:44
2008.07.27
Сортировать таблицу в случайном порядке в SQL


2-1214450709
Олег
2008-06-26 07:25
2008.07.27
Удаление дубликатов в DBF





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский