Einzelnen Beitrag anzeigen

QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.930 Beiträge
 
Delphi 12 Athens
 
#1

Logfile von Windows7/Server 2008 Blockiert

  Alt 28. Okt 2010, 14:20
Hallo,
Ich benutze die unten angefügte Unit zum loggen von Dienst und Anwednungsereigniss in einer D7 Anwendung/Dienstanwendung.

Zum Schreiben in die Datei wird eine Instanz über das Interface ILOGFile erzeugt und mit Log angesprochen. Es wird immer in eine Liste(Stringsout) und in eine Datei geloggt....
Die liste soll uns hier nicht interessieren.

Das problem mit der Datei ist das ich sie in XP/W2K während der Dienst läuft öffnen und angucken kann. Auf einem Kunden Rechner der W7/W-Server2k+8 drauf hat ist die Datei nicht zu öffnen weil sie gerade benutzt wird....

Benutze zum angucken des Logs Notepad und Wordpad des jeweiligen systems....beide zeigen das selbe verhalten.

Warum ist das so blöde?


Code:
unit LogFile;

interface
uses sysutils, Classes, Forms;

type

ILogFile = interface(IInterface)
['{6BDBB5CF-77B2-4E0F-8D2C-3DD06DC1AE55}']
  Function openLogFile(alogFilePath : String) : boolean;
  Function Log(aText : String) : boolean;

  Function getLogFilepath : String;
  Function getIsOpen : boolean;
  Function getStringsOut : TStrings;
  Function getLastLogTime : TDatetime;
  Procedure setStringsOut(aLogList : TStrings);
end;


TCustomLogFile = Class(TInterfacedobject, ILogFile)
Private
  fLogFile: String;
  fIsOpen: Boolean;
  fStringsOut: TStrings;
  fFile: TextFile;
  fLastLogTime: TDateTime;
Public
  Constructor Create;virtual;
  Destructor Destroy;override;

  Function OpenLogFile(alogFilePath : String) : boolean;
  Function Log(aText : String) : boolean;

  Function getLogFilePath : String;
  Function getIsOpen : boolean;
  Function getStringsOut : TStrings;
  Procedure setStringsOut(aLogList : TStrings);
  Function getLastLogTime : TDatetime;

  Property IsOpen: boolean read getIsOpen;
  Property LogFilePath : String read getLogFilePath;
  Property StringsOut : TStrings read getStringsOut write setStringsOut;
  Property LastLogTime : TDateTime read getLastLogTime;
end;

TLogfile = class(TCustomLogFile)
public
  Constructor Create(aLogfile:String;aStringsOut:TStrings);Virtual;
  Destructor Destroy;override;
end;

var StandardLogFile:ILogFile;

implementation

Constructor TLogfile.Create(aLogfile:String;aStringsOut:TStrings);
Begin
  inherited Create;
  If alogFile <> '' then
    OpenLogFile(aLogFile);
  StringsOut := aStringsOut;
  if isOpen or assigned(StringsOut) then
    Log('Log gestartet');
end;

Destructor TLogfile.Destroy;
Begin
  try
    Log('Log beendet');
  finally
    inherited Destroy;
  end;
end;

Function TCustomLogFile.getLastLogTime : TDatetime;
begin
  Result := fLastLogTime;
end;

Constructor TCustomLogFile.Create;
Begin
  inherited;
  fLogFile:= '';
  fIsOpen:= false;
  fStringsOut:= nil;
  fLastLogTime := Now;
end;

Destructor TCustomLogFile.Destroy;
Begin
  if IsOpen then
  begin
    Closefile(fFile);
    fIsOpen := false;
  end;
  inherited;
end;

Function TCustomLogFile.openLogFile(alogFilePath : String) : boolean;
Begin
  Try
    fLogFile := alogFilePath;
    AssignFile(FFile, fLogFile);
    If not FileExists(fLogFile) then
      Rewrite(FFile)
    else
      Append(FFile);
  except
    On e:Exception do
    Begin
      flogfile := '';
      raise Exception.create(e.Message);
      fIsOpen := false;
    end;
  end;
  fIsOpen := true;
end;

Function TCustomLogFile.Log(aText : String) : boolean;
var s:String;
Begin
  try
    if StringsOut <> nil then
      StringsOut.Add(aText);
  except
    on e:Exception do
    Begin
      s := 'Interner Fehler beim Schreiben in Log-Ausgabe-Objekt. '+
           'Dies ist nur dann ein normaler Vorgang wenn die Anwendung gerade '+
           'beendet wird. Das Log-Ausgabe-Objekt wird nun nicht mehr '+
           'angesprochen : '+E.message;
      StringsOut := nil;
      try
        If isOpen then
          Writeln(ffile,DateTimeToStr(now)+#9#9+s);
      except
      end;
    end;
  end;
  if isOpen then
  Begin
    WriteLn(fFile,DateTimeToStr(now)+#9#9+aText);
    Flush(fFile);
  end;
  fLastLogTime := now;
end;

Function TCustomLogFile.getLogFilePath : String;
Begin
  result := fLogFile;
end;

Function TCustomLogFile.getIsOpen : boolean;
Begin
  result := fIsOpen;
end;

Function TCustomLogFile.getStringsOut : TStrings;
Begin
  Result := fStringsOut;
end;

Procedure TCustomLogFile.setStringsOut(aLogList : TStrings);
Begin
  fStringsOut := aLogList;
end;


end.
Aufrufen

Code:
Procedure TFormbla.FromCreate(etc:tobject);
Begin
    if Application.Tag = 0 then // Wenn kein Dienst.
      StandardLogFile.setStringsOut(PR.lines)
    else
      StandardLogFile.setStringsOut(nil);
end;


procedure TFormbla.FormDestroy(Sender: TObject);
begin
  StandardLogFile.setStringsOut(nil);
  StandardLogFile.log('');
  StandardLogFile.Log('TFormbla.FormDestroy');
end;

Procedure TFormbla.OnPlanerIdle(Sender: TObject);
Begin
  DoSelbstTest;
  // Ergebnisse Loggen....&c.
  StandardLogFile.Log('ISDN - Offene Verbindungen : ' + IntToStr(cp.OpenConnections.count));
  StandardLogFile.Log('ISDN - Listenstate        : ' + BoolToStr(cp.Listening,true));
  StandardLogFile.Log('ISDN - Message            : ' + cp.ErrorString);

end;

initialization
  Logfile.StandardLogFile := TLogFile.Create('c:\Meinprogramm', nil);
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat