AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Logfile von Windows7/Server 2008 Blockiert
Thema durchsuchen
Ansicht
Themen-Optionen

Logfile von Windows7/Server 2008 Blockiert

Ein Thema von QuickAndDirty · begonnen am 28. Okt 2010 · letzter Beitrag vom 28. Okt 2010
Antwort Antwort
QuickAndDirty

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

Logfile von Windows7/Server 2008 Blockiert

  Alt 28. Okt 2010, 13: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
QuickAndDirty

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

AW: Logfile von Windows7/Server 2008 Blockiert

  Alt 28. Okt 2010, 14:46
Also im prinzip ein AssignFile, AppendFile, Writeln, Flush, closefile...mehr nicht
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#3

AW: Logfile von Windows7/Server 2008 Blockiert

  Alt 28. Okt 2010, 15:34
Beim Öffnen des Logfiles sollten die Flags SHARE_DENYREAD und ggf. auch SHARE_DENYWRITE angegeben werden.
Dann kann die Datei von deinem Logobjekt geöffnet sein und man kann trotzdem mit anderen Programmen in die Logdatei reinschauen.
Blöderweise verwendest du die steinalten Pascal-Funktionen AssignFile, AppendFile, Writeln, Flush, closefile.
Andreas
  Mit Zitat antworten Zitat
QuickAndDirty

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

AW: Logfile von Windows7/Server 2008 Blockiert

  Alt 28. Okt 2010, 16:07
Ja aber warum ist das in XP so wie es ist ok und in W7 anders?
ich meine setzt D7 andere Shareflags oder hat W7 einfach andere default Einstellungen?

Wie würdest es fixen ? Filestream, Api verwenden???
Kann ich beim Assignfile nicht irgendwie den Sharemode angeben?
Andreas
Monads? Wtf are Monads?

Geändert von QuickAndDirty (28. Okt 2010 um 16:25 Uhr)
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#5

AW: Logfile von Windows7/Server 2008 Blockiert

  Alt 28. Okt 2010, 16:55
Wie würdest es fixen ? Filestream, Api verwenden???
Ich würde einen THandleStream verwenden.
Bei einem THandleStream kannst du zuvor ein (File)Handle mit der API-Funktion CreateFile()
erzeugen und dem HandleStream übergeben.
(weil CreateFile() mehr Möglichkeiten bietet als TFileStream.Create)

Kann ich beim Assignfile nicht irgendwie den Sharemode angeben?
Selbst wenn es geht; das wäre Quick&Dirty!
Writeln ist ja gepuffert, aber das möchte man bei einem Logfile gerade nicht haben.
Andreas
  Mit Zitat antworten Zitat
QuickAndDirty

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

AW: Logfile von Windows7/Server 2008 Blockiert

  Alt 28. Okt 2010, 17:12
Habe is schon auf Filestream umgestellt.... aber mal sehen die Methoden sind ja universell...stream ist stream und so...


@Assignfile...
Und ja es wäre QuickAndDirty aber hey....style over substance....was glaubst woher die ganzen Fenster mit Glaseffect und Farbverlauf kommen?
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:41 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz