Entwickler-Ecke

Dateizugriff - *.log File schreiben...[done]


G-man - Di 16.09.03 16:15
Titel: *.log File schreiben...[done]
Moin,
kann mir jemand sagen, wie ich eine *.log File schreiben kann, (aus einem Delphiprogramm heraus)?


barfuesser - Di 16.09.03 16:42

als Tips: Suche in: Delphi-Forum, Delphi-Library ASSIGNFILE OR APPENDFILE OR WRITELN OR CLOSEFILE

barfuesser


Delete - Di 16.09.03 18:06

Und noch ein brandheißer Tipp: Suche in: Delphi-Forum, Delphi-Library TSTRINGLIST.


mimi - Mi 17.09.03 17:34

NOCH besser: Suche in: Delphi-Forum, Delphi-Library TFILESTREAM


Licki - Do 18.09.03 09:06

Guter Tipp, ähnliche Frage hatte ich auch.


Tino - Do 18.09.03 10:24

Hallo,

ich benutze für kleine Projekte oft die folgende Unit. Damit kann man recht einfach ein Logfile schreiben. Einfach im Programm eine Instance von tLogFile erzeugen und mit den Methoden WriteHint, WriteError, etc Einträge in das Logfile schreiben. Mit Hilfe der Methoden BeginSection und EndSection kann man dem Logfile ein wenig Übersichtlichkeit spendieren:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
Unit LogFile;

Interface

Type
  tLogFileLineTypeId = (
      idLogFileLineTypeDebug,
      idLogFileLineTypeHint,
      idLogFileLineTypeWarning,
      idLogFileLineTypeError
    );

  tLogFile = Class
      Private
        fFile: TextFile;
        fSectionLevel: Integer;
        fWithDebug: Boolean;

        Procedure WriteLine (aType: tLogFileLineTypeId; aText: String);
      Public
        Constructor Create (aFilename: String);
        Destructor Destroy;  override;

        Procedure BeginSection;
        Procedure EndSection;

        Procedure WriteDebug (aText: String);
        Procedure WriteHint (aText: String);
        Procedure WriteWarning (aText: String);
        Procedure WriteError (aText: String);
        Procedure WriteEmptyLine;

        Property  WithDebug: Boolean read fWithDebug write fWithDebug;
    End;

Implementation

Uses
  SysUtils;

Constructor tLogFile.Create (aFilename: String);
Begin
  AssignFile (fFile, aFileName);

  If FileExists (aFilename) Then
    Append (fFile)
  Else
    Rewrite (fFile);

  fSectionLevel := 0;
  fWithDebug := False;
End;

Destructor tLogFile.Destroy;
Begin
  CloseFile (fFile);

  Inherited;
End;

Procedure tLogFile.WriteLine (aType: tLogFileLineTypeId; aText: String);
Const
  cTypeChar : Array [tLogFileLineTypeId] Of Char = ('D'' ''*''!');

    Function GetSpace (aLength: Integer): String;
    Var
      Str: String;
    Begin
      Str := '';

      While Length (Str) < aLength Do
        Str := Str + #32;

      GetSpace := Str;
    End;

Var
  Str: String;
Begin
  If (aType = idLogFileLineTypeDebug) and Not fWithDebug Then
    Exit;

  Str := FormatDateTime ('yy/mm/dd hh:nn:ss', Now);
  Str := Str + #32 + cTypeChar [aType] + #32 + GetSpace (fSectionLevel * 2) + aText;

  WriteLN (fFile, Str);
End;

Procedure tLogFile.WriteDebug (aText: String);
Begin
  WriteLine (idLogFileLineTypeDebug, aText);
End;

Procedure tLogFile.WriteHint (aText: String);
Begin
  WriteLine (idLogFileLineTypeHint, aText);
End;

Procedure tLogFile.WriteWarning (aText: String);
Begin
  WriteLine (idLogFileLineTypeWarning, aText);
End;

Procedure tLogFile.WriteError (aText: String);
Begin
  WriteLine (idLogFileLineTypeError, aText);
End;

Procedure tLogFile.WriteEmptyLine;
Begin
  WriteLN (fFile, '');
End;

Procedure tLogFile.BeginSection;
Begin
  Inc (fSectionLevel);
End;

Procedure tLogFile.EndSection;
Begin
  Dec (fSectionLevel);
  If fSectionLevel < 0 Then
    fSectionLevel := 0;
End;

End.

Gruß
Tino


G-man - Fr 19.09.03 13:10

Vielen Dank, sowas hatte ich gesucht...


Udontknow - Fr 19.09.03 14:26

Sehr nützlich, die Unit! :)

BTW: Wir wäre es mit einer Sparte "Units", in der man häufig verwendete Units / Komponenten ablegt?

Cu,
Udontknow


maximus - Fr 19.09.03 15:14

Udontknow hat folgendes geschrieben:

BTW: Wir wäre es mit einer Sparte "Units", in der man häufig verwendete Units / Komponenten ablegt?
...


ich würde sogar noch eine schritt weiter gehen und eine sektion einrichten, in der man units zur diskussion stellen kann und die community kann sie dann weiterentwickeln und ergänzen. Die fertigen units werden dann gesammelt und alle AUQler dürfen sie dann frei benutzen!

denke so könnte man eine schöne code-base schaffen, die uns das leben einfacher machen würde..?


Crowbar - Sa 17.01.04 19:08

Hi,
ich möchte dieses Thema noch einmal kurz mit einer Frage "öffnen".
In meinem Programm möchte ich ebenfalls eine "error.log" - Datei erstellen lassen, um darin die aufgetretenen Fehlermeldungen zu speichern und anschliessend auszuwerten bzw. zu beheben. ;-)
Ist es zusätzlich irgendwie möglich, auch die Quellcode-Zeile mitzuloggen, an der der Fehler auftrat?
Zum Beispiel:
EConvertError in Zeile 199 aufgetreten

Natürlich könnte man in jeder "gefährlichen" Routine einen "try...except..end" - Block mit der entsprechenden Quellcode-Zeile schreiben, wie z.B.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
197:  ...
198:  try
199:   a:=StrToInt(123);
200:  except 
201:   showmessage('Fehler in Zeile 199 aufgetreten');
202:  end;
203:  ...

aber dies wäre irgendwie zu aufwendig. Da ich zumal meine Exceptions gesondert bzw. zusätzlich mit:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
Procedure TForm1.AppException(Sender: TObject; E: Exception);
begin
  MessageDlg('Es ist folgender Fehler aufgetreten:'+#10#13#10#13+E.Message+#10#13+
      'Fehlertyp: '+E.ClassName+#10#13+'Sender: '+Sender.ClassName,mtError,[mbOk],0);
end;

Procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnException :=AppException;
  ...
end;

abfange.

Cu,
Crowbar

Moderiert von user profile iconPeter Lustig: Code- durch Delphi-Tags ersetzt


LarsMiddendorf - Sa 17.01.04 23:21

Eine andere Methode ist im initialization Block eine Datei zu öffnen und der Variablen Output diese Datei zuzuweisen. Dann kann man überall im Programm einfach mit writeln in die Log Datei schreiben und braucht die log unit nicht überall einzubinden. Im finalization Block der log Unit schließt man die Datei dann wieder.