Форум: "Основная";
Текущий архив: 2005.07.25;
Скачать: [xml.tar.bz2];
ВнизКак правильно вести Log файл? Найти похожие ветки
← →
Demidoff © (2005-07-08 08:51) [0]В один текстовый файл?
← →
Demidoff © (2005-07-08 08:53) [1](Дополнение)
Каким образом мы можем включать строки в текстовый файл не занося его в мемо или не открывая в программе. При этом как делать перескок на следующую страницу.
← →
ssk © (2005-07-08 09:00) [2]не знаю, кто как, я лично по-быстрячку нацарапал вот такой модуль (можно было и без него обойтись, конечно) и его использую.
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
← →
Anatoly Podgoretsky © (2005-07-08 09:05) [3]Demidoff © (08.07.05 08:53) [1]
1. WriteLn
2. Не возможно, принципы работы с файлами не позволяют не открывать их.
3. О каких страницаз идет речь, может поможет символ FF (Feed Format)?
← →
evvcom © (2005-07-08 09:11) [4]
> Как правильно вести Log файл?
Смотря для чего ты его ведешь. Зависит от задачи.
> Каким образом мы можем включать строки в текстовый файл
> не занося его в мемо
Write, Writeln
> или не открывая в программе
А вот это уже никак.
> При этом как делать перескок на следующую страницу.
В текстовом файле нет страниц.
← →
Anatoly Podgoretsky © (2005-07-08 09:18) [5]evvcom © (08.07.05 09:11) [4]
Зато могут быть разделители страниц.
← →
evvcom © (2005-07-08 09:24) [6]
> Anatoly Podgoretsky © (08.07.05 09:18) [5]
Я знаю, что можно вставить спец.символ, который при печати на принтере в текстовом режиме вызовет прогон бумаги/листа, но про принтер автор не сказал ни слова. :) А в блокноте такой текстовый документ все равно не будет выглядеть как поделенный на страницы. Да и нафиг он этот символ при печати из винды?
← →
Anatoly Podgoretsky © (2005-07-08 10:07) [7]evvcom © (08.07.05 09:24) [6]
Anatoly Podgoretsky © (08.07.05 09:05) [3]
3. О каких страницаз идет речь,
← →
Slym © (2005-07-08 10:24) [8]Вопрос: Как правильно вести Log файл?
Ответ:
1. Чтобы в лог файл попали "нужные" данные, и было как можно меньше "мусора".
2. В лог файле должны быть данные за необходимый период, т.е. за период срока "жизни сообщения". Если срок жизни велик, необходимо чтобы лог файл, либо архивировался и очищался, либо использовалось различное именование файлов с обязательным указанием периода в названии файла.
3. Лог файл должен быль удобочитаемым и/или с возможностью быстрого поиска по критерию
4. Работа лог движка не должна нагружать программу
← →
Slym © (2005-07-08 10:25) [9]Требованиям удовлетворяет Лог движок на SQL СУБД
← →
Чапаев © (2005-07-08 12:16) [10]Я обычно пользую что-то вроде:
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.
← →
Плохиш © (2005-07-08 12:39) [11]
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.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.07.25;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.01 c