![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как правильно вести 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](Дополнение)
Каким образом мы можем включать строки в текстовый файл не занося его в мемо или не открывая в программе. При этом как делать перескок на следующую страницу.