Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.013 c
1-1120478877
Bless
2005-07-04 16:07
2005.07.25
Бывают ли объекты с self=nil?


1-1120651701
td
2005-07-06 16:08
2005.07.25
командная строка и консольное приложение


1-1120666164
jagr
2005-07-06 20:09
2005.07.25
Подпрограмма не определяет компонент


3-1118396661
Леонид
2005-06-10 13:44
2005.07.25
Как узнать значение поля после инсерта, поле автоинкрементное


4-1117274384
Петр
2005-05-28 13:59
2005.07.25
Работа с колесиком мыши





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский