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

Вниз

Как правильно вести 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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.04 c
4-1117208153
nes
2005-05-27 19:35
2005.07.25
windows.GetAsyncKeyState(vKey)


14-1120381468
Nous Mellon
2005-07-03 13:04
2005.07.25
Простой, надеюсь, вопрос по Си


14-1120022374
Иксик
2005-06-29 09:19
2005.07.25
Киев-Симферополь поездом


1-1120377854
VadimX
2005-07-03 12:04
2005.07.25
Помогите оптимизировать код


1-1120671763
Kulon
2005-07-06 21:42
2005.07.25
Delphi and AutoCAD2004