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

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.012 c
8-1183559340
alex30341
2007-07-04 18:29
2008.07.27
Перехват видео


3-1202913301
AlexeyMir
2008-02-13 17:35
2008.07.27
Кеширование БД


2-1214227493
abhtr
2008-06-23 17:24
2008.07.27
ошибка: "Text exceeds memo capacity"


15-1213076173
Term
2008-06-10 09:36
2008.07.27
Делфи и 64х разрядная архитектура


1-1195929273
SkyN
2007-11-24 21:34
2008.07.27
парсинг строки "Attr1=Val1; Attr2=Val2; Attr3=Val3"