Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как правильно вести Log файл? [D7, WinXP]


Demidoff ©   (2005-07-08 08:51:00) 

В один текстовый файл?


Плохиш   (2005-07-08 12:39:00) [1]


interface
type
 TLogFile = class
   FFileName:  String;
   FLogBuf:    TStrings;
   public
     constructor Create(AFileName: String = '');
     destructor  Destroy; override;
     procedure   Add(AStrLog: String); virtual;
     procedure   AddStr(AStrLog: String); virtual;
     procedure   AddValue(AName: String; AValue: Variant; AOhneTime: Boolean = false); virtual;
     procedure   AddDynArr(AName: String; AValue: TByteDynArray; AOhneTime: Boolean = false); overload;
     procedure   AddDynArr(AName: String; AValue: TShortIntDynArray; AOhneTime: Boolean = false); overload;
     procedure   Save; virtual;
 end;

var
   MainLog:  TLogFile;

implementation

procedure TLogFile.Add(AStrLog: String);
begin
 FLogBuf.Add(FormatDateTime('"["dd/mm/yyyy" - "hh:nn:ss"] "', now) + AStrLog);
end;

procedure TLogFile.AddStr(AStrLog: String);
begin
 FLogBuf.Add(AStrLog);
end;

procedure TLogFile.AddValue(AName: String; AValue: Variant; AOhneTime: Boolean);
var
   sValue: String;
begin
 sValue := VarToStr(AValue);
 sValue := AName + ' = ' + sValue;
 if AOhneTime then AddStr(sValue) else Add(sValue);
end;

procedure TLogFile.AddDynArr(AName: String; AValue: TByteDynArray;
 AOhneTime: Boolean);
var
   sValue: String;
   lIndex: Integer;
begin
 sValue := '';
 for lIndex := Low(AValue) to High(AValue) do
   sValue := sValue + chr(AValue[lIndex]);
 sValue := AName + ' = ' + sValue;
 if AOhneTime then AddStr(sValue) else Add(sValue);
end;

procedure TLogFile.AddDynArr(AName: String; AValue: TShortIntDynArray;
 AOhneTime: Boolean);
var
   sValue: String;
   lIndex: Integer;
begin
 sValue := '';
 for lIndex := Low(AValue) to High(AValue) do
   sValue := sValue + chr(byte(AValue[lIndex]));
 sValue := AName + ' = ' + sValue;
 if AOhneTime then AddStr(sValue) else Add(sValue);
end;

constructor TLogFile.Create(AFileName: String);
begin
 inherited Create;
 if AFileName = '' then  FFileName := cLogFile
 else if ExtractFilePath(AFileName) <> '' then FFileName := AFileName
 else
{$IFDEF MSWINDOWS}
   FFileName := IncludeTrailingPathDelimiter(GetEnvironmentVariable('temp')) + AFileName;
{$ENDIF}
{$IFDEF LINUX}
   FFileName := '/tmp/' + AFileName;
{$ENDIF}
 FLogBuf := TStringList.Create;
 TStringList(FLogBuf).Sorted := false;
end;

destructor TLogFile.Destroy;
begin
 if FLogBuf.Count > 0 then Save;
 FLogBuf.Free;
 inherited;
end;

procedure TLogFile.Save;
var
   FOut:     TStream;
   bCreated: Boolean;
begin
 bCreated := false;
 FOut := nil;
 if not FileExists(FFileName) then
   FOut := TFileStream.Create(FFileName, fmCreate)
 else
   repeat
     try
       FOut := TFileStream.Create(FFileName, fmOpenReadWrite + fmShareExclusive);
       bCreated := true;
     except
       on EFOpenError do Sleep(500)
       else raise;
     end;
   until bCreated;
 try
   FOut.Seek(0, soFromEnd);
   FLogBuf.SaveToStream(FOut);
   FLogBuf.Clear;
 finally
   Fout.Free;
 end;
end;

initialization
{$IFDEF MSWINDOWS}
 cLogFile := IncludeTrailingPathDelimiter(GetEnvironmentVariable('temp')) + ChangeFileExt(ExtractFileName(ParamStr(0)), '.log');
{$ENDIF}
{$IFDEF LINUX}
 cLogFile := '/tmp/' + ChangeFileExt(ExtractFileName(ParamStr(0)), '.log');
{$ENDIF}
 MainLog := TLogFile.Create();

finalization
 MainLog.Free;

end.


Чапаев   (2005-07-08 12:16:00) [2]

Я обычно пользую что-то вроде:

unit ...
interface
procedure Log(const Msg:string);
implementation
var
 LogFile:TextFile;
procedure Log;
begin
 WriteLn(LogFile,FormatDateTime('hh:mm:ss.zzz',Now)+' '+Msg);
end;
initialization
 AssignFile(LogFile);
 Rewrite(LogFile); //Или Append(), это уж кому что
finalization
 CloseFile(LogFile);
end.


Slym   (2005-07-08 10:25:00) [3]

Требованиям удовлетворяет Лог движок на SQL СУБД


Slym   (2005-07-08 10:24:00) [4]

Вопрос: Как правильно вести Log файл?
Ответ:
1. Чтобы в лог файл попали "нужные" данные, и было как можно меньше "мусора".
2. В лог файле должны быть данные за необходимый период, т.е. за период срока "жизни сообщения". Если срок жизни велик, необходимо чтобы лог файл, либо архивировался и очищался, либо использовалось различное именование файлов с обязательным указанием периода в названии файла.
3. Лог файл должен быль удобочитаемым и/или с возможностью быстрого поиска по критерию
4. Работа лог движка не должна нагружать программу


Anatoly Podgoretsky   (2005-07-08 10:07:00) [5]

evvcom ©   (08.07.05 09:24) [6]
Anatoly Podgoretsky ©   (08.07.05 09:05) [3]
3. О каких страницаз идет речь,


evvcom   (2005-07-08 09:24:00) [6]


> Anatoly Podgoretsky ©   (08.07.05 09:18) [5]

Я знаю, что можно вставить спец.символ, который при печати на принтере в текстовом режиме вызовет прогон бумаги/листа, но про принтер автор не сказал ни слова. :) А в блокноте такой текстовый документ все равно не будет выглядеть как поделенный на страницы. Да и нафиг он этот символ при печати из винды?


Anatoly Podgoretsky   (2005-07-08 09:18:00) [7]

evvcom ©   (08.07.05 09:11) [4]
Зато могут быть разделители страниц.


evvcom   (2005-07-08 09:11:00) [8]


> Как правильно вести Log файл?

Смотря для чего ты его ведешь. Зависит от задачи.

> Каким образом мы можем включать строки в текстовый файл
> не занося его в мемо

Write, Writeln

> или не открывая в программе

А вот это уже никак.

> При этом как делать перескок на следующую страницу.

В текстовом файле нет страниц.


Anatoly Podgoretsky   (2005-07-08 09:05:00) [9]

Demidoff ©   (08.07.05 08:53) [1]
1. WriteLn
2. Не возможно, принципы работы с файлами не позволяют не открывать их.
3. О каких страницаз идет речь, может поможет символ FF (Feed Format)?


ssk   (2005-07-08 09:00:00) [10]

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


unit unitLOG;

interface

uses
 Windows, SysUtils;

procedure Log(TextMsg: string);

implementation

function GetLOGFileName: string;
begin
 Result := AnsiLowerCase(ChangeFileExt(ParamStr(0), '.log'));
end;

procedure Log(TextMsg: string);
var
 f: TextFile;
begin
 AssignFile(f, GetLOGFileName);
{$I-}
 Append(f);
{$I+}
 if IOResult <> 0 then
   Rewrite(f);
 Writeln(f, TextMsg);
 Flush(f);
 CloseFile(f);
end;

initialization
 DeleteFile(PAnsiChar(GetLOGFileName));

end.


подсоединяешь его в проект, а в программе потом пишешь:

Log('_строка_результата_');

в итоге получаешь файл с расширением .log


Demidoff   (2005-07-08 08:53:00) [11]

(Дополнение)
Каким образом мы можем включать строки в текстовый файл не занося его в мемо или не открывая в программе. При этом как делать перескок на следующую страницу.


Наверх

Титульная страница Поиск, карта сайта Написать письмо