Frage

Ich bin für eine Suche (ziemlich schmerzfrei) bedeutet, dass einige Windows-Anwendungsereignisprotokoll-Unterstützung auf ein kleines Vermächtnis Delphi 5-Anwendung hinzuzufügen. Wir wollen es nur anmelden, wenn es beginnt-up, schaltet sich nach unten, in eine Datenbank keine Verbindung herstellen kann usw.

Einige der Lösungen / Komponenten Ich habe gesehen scheinen zu zeigen, dass wir eine Ressource DLL vornehmen müssen werden, die der Windows-Ereignisprotokoll-Viewer wird, sobald versuchen, unsere ‚Einträge‘ zu lesen. Zwar ist dies nicht zu belastend scheint, ich denke, es ist etwas anderes im Auge zu behalten, wenn / wenn wir weiter die Anwendung in Zukunft entwickeln - wir werden diese DLL auf dem neuesten Stand halten müssen.

An einem gewissen Punkt in der Zukunft wollen wir die Anwendung in einen Dienst aktivieren, wahrscheinlich in D2007 geschrieben.

So kann man eine geeignete Route für das Hinzufügen von Ereignissen in das Ereignisprotokoll in D5 empfehlen? Ich bin auf der Suche nach bestimmten ‚ wir diese verwendet, und es war in Ordnung ‘ Kommentare eher als ein Google Schleppnetz (was ich kann mich tun!) Free oder einbezahlten für, wirklich nichts ausmacht - aber etwas dass ich D2007 wandern könnte in der Zukunft wichtig ist.

War es hilfreich?

Lösung 4

Dank J und Peter Antworten, habe ich meinen Code in das Ereignis zu schreiben sofort anmelden. Es ist ein wenig mehr zu tun, vor allem, wenn Sie Ihre Events ‚schön‘ erscheinen sollen im Ereignisprotokoll ohne Standard-Windows-Meldung über nicht in der Lage zu sein, die Beschreibung zu finden (nach unten in J 's post).

ich die Tipps gefolgt hier , um eine geeignete DLL zu machen und sie in die Registrierung eingegeben hat, und sehr schnell war alles aussortiert.

Das war alles in Delphi5, wie pro der Frage, aber ich habe nichts gesehen, die ich denke, dass es nicht auch in D2007 funktionieren würde.

Andere Tipps

Zusammenfassung: Das Schreiben in dem Windows-Ereignisprotokoll mit Delphi


Wenn Sie einen Windows-Dienst schreiben und müssen dem lokalen Computer des Windows-Ereignisprotokoll schreiben, dann können Sie anrufen TService. LogMessage wie erwähnt hier .

//TMyTestService = class(TService)

procedure TMyTestService.ServiceStart(Sender: TService; var Started: Boolean);
begin
  LogMessage('This is an error.');
  LogMessage('This is another error.', EVENTLOG_ERROR_TYPE);
  LogMessage('This is information.', EVENTLOG_INFORMATION_TYPE);
  LogMessage('This is a warning.', EVENTLOG_WARNING_TYPE);
end;

Für jede andere Art von Anwendungen können Sie die SvcMgr verwenden. TEventLogger undokumentierte Hilfsklasse für TService das den lokalen Computer des Windows-Ereignisprotokoll zu schreiben, wie a href erwähnt <= "https://stackoverflow.com/questions/1303253/any-light-for- TEventLogger / 1303290 # 1303290 "> hier , hier und hier .

uses
  SvcMgr;

procedure TForm1.EventLoggerExampleButtonClick(Sender: TObject);
begin
  with TEventLogger.Create('My Test App Name') do
  begin
    try
      LogMessage('This is an error.');
      LogMessage('This is another error.', EVENTLOG_ERROR_TYPE);
      LogMessage('This is information.', EVENTLOG_INFORMATION_TYPE);
      LogMessage('This is a warning.', EVENTLOG_WARNING_TYPE);
    finally
      Free;
    end;
  end;
end;

Sie können auch den Windows-API verwenden Report Funktion wie erwähnt hier und hier .

ich eine einfache Klasse erstellt haben, um es einfacher zu machen, ist es auf GitHub verfügbar .

//----------------- EXAMPLE USAGE: ---------------------------------

uses
  EventLog;

procedure TForm1.EventLogExampleButtonClick(Sender: TObject);
begin
  TEventLog.Source := 'My Test App Name';

  TEventLog.WriteError('This is an error.');
  TEventLog.WriteInfo('This is information.');
  TEventLog.WriteWarning('This is a warning.');
end;

//------------------------------------------------------------------


unit EventLog;

interface

type
  TEventLog = class
  private
    class procedure CheckEventLogHandle;
    class procedure Write(AEntryType: Word; AEventId: Cardinal; AMessage: string); static;
  public
    class var Source: string;
    class destructor Destroy;

    class procedure WriteInfo(AMessage: string); static;
    class procedure WriteWarning(AMessage: string); static;
    class procedure WriteError(AMessage: string); static;

    class procedure AddEventSourceToRegistry; static;
  end;

threadvar EventLogHandle: THandle;

implementation

uses Windows, Registry, SysUtils;

class destructor TEventLog.Destroy;
begin
  if EventLogHandle > 0 then
  begin
    DeregisterEventSource(EventLogHandle);
  end;
end;

class procedure TEventLog.WriteInfo(AMessage: string);
begin
  Write(EVENTLOG_INFORMATION_TYPE, 2, AMessage);
end;

class procedure TEventLog.WriteWarning(AMessage: string);
begin
  Write(EVENTLOG_WARNING_TYPE, 3, AMessage);
end;

class procedure TEventLog.WriteError(AMessage: string);
begin
  Write(EVENTLOG_ERROR_TYPE, 4, AMessage);
end;

class procedure TEventLog.CheckEventLogHandle;
begin
  if EventLogHandle = 0 then
  begin
   EventLogHandle := RegisterEventSource(nil, PChar(Source));
  end;
  if EventLogHandle <= 0 then
  begin
    raise Exception.Create('Could not obtain Event Log handle.');
  end;
end;

class procedure TEventLog.Write(AEntryType: Word; AEventId: Cardinal; AMessage: string);
begin
  CheckEventLogHandle;
  ReportEvent(EventLogHandle, AEntryType, 0, AEventId, nil, 1, 0, @AMessage, nil);
end;

// This requires admin rights. Typically called once-off during the application's installation
class procedure TEventLog.AddEventSourceToRegistry;
var
  reg: TRegistry;
begin
  reg := TRegistry.Create;
  try
    reg.RootKey := HKEY_LOCAL_MACHINE;
    if reg.OpenKey('\SYSTEM\CurrentControlSet\Services\Eventlog\Application\' + Source, True) then
    begin
      reg.WriteString('EventMessageFile', ParamStr(0)); // The application exe's path
      reg.WriteInteger('TypesSupported', 7);
      reg.CloseKey;
    end
    else
    begin
      raise Exception.Create('Error updating the registry. This action requires administrative rights.');
    end;
  finally
    reg.Free;
  end;
end;

initialization

TEventLog.Source := 'My Application Name';

end.

Report unterstützt das Schreiben eines Protokolleintrag zu einem lokalen oder Remote-Ereignisprotokoll der Maschine. siehe für ein Remote-Beispiel John Kaster des EDN Artikel .


Beachten Sie, dass Sie auch auf registrieren Ihre Ereignisquelle sonst alle Ihrer Log-Meldungen werden mit etwas wie folgen beginnen:

  

Die Beschreibung für Ereignis-ID xxx von der Quelle xxxx kann nicht sein,   gefunden. Entweder ist die Komponente, die dieses Ereignis auslöst wird nicht installiert   Ihr lokaler Computer oder die Installation ist beschädigt. Sie können installieren   oder Reparatur der Komponente auf dem lokalen Computer.

     

Wenn das Ereignis auf einem anderen Computer erstellt wurde, die Anzeigeinformation   hatte mit dem Ereignis gespeichert werden.

     

Die folgenden Informationen wurden mit dem Ereignis enthalten:

1, für weitere Informationen, wie eine Nachrichtendatei erstellen finden Sie unter Finn Tolderlund Tutorial oder Michael Hex Artikel oder Sie können eine vorhandene MC verwenden und RES-Datei enthalten in das GitHub Projekt .

2, einbetten die RES in Ihre Anwendung Datei, indem Sie das MessageFile.res in Ihrer DPR-Datei enthält. Alternativ können Sie eine DLL für die Nachrichten erstellen.

program MyTestApp;

uses
  Forms,
  FormMain in 'FormMain.pas' {MainForm},
  EventLog in 'EventLog.pas';

{$R *.res}
{$R MessageFile\MessageFile.res}

begin
  Application.Initialize;

3, die einmalige Anmeldung erfordert Admin-Rechte für die Registrierung zu schreiben, so dass es uns in der Regel als Teil Ihrer Anwendung Installationsprozess durchgeführt.

//For example
AddEventSourceToRegistry('My Application Name', ParamStr(0));
//or
AddEventSourceToRegistry('My Application Name', 'C:\Program Files\MyApp\Messages.dll');

//--------------------------------------------------

procedure AddEventSourceToRegistry(ASource, AFilename: string);
var
  reg: TRegistry;
begin
  reg := TRegistry.Create;
  try
    reg.RootKey := HKEY_LOCAL_MACHINE;
    if reg.OpenKey('\SYSTEM\CurrentControlSet\Services\Eventlog\Application\' + ASource, True) then
    begin
      reg.WriteString('EventMessageFile', AFilename);
      reg.WriteInteger('TypesSupported', 7);
      reg.CloseKey;
    end
    else
    begin
      raise Exception.Create('Error updating the registry. This action requires administrative rights.');
    end;
  finally
    reg.Free;
  end;
end;

Wenn Sie Windows-Ereignisprotokollierung benötigen und andere Protokollierung Anforderungen Sie auch Logging Frameworks wie log4d und TraceTool


Siehe hier , wenn Sie in das Ereignisprotokoll schreiben wollen Fenster in den Delphi-IDE.

Für einfaches Ereignis in D5 Anmeldung habe ich den folgenden Code verwendet, um Nachrichten zu den Anwendungen hinzuzufügen loggt sein.

  • Add "SvcMgr" zur uses-Klausel
  • Mit diesem Code Verwenden Sie Ihre Textnachricht und eine ID-Nummer (letzten Parameter auf LogMessage Linien)

    hinzufügen
    with TEventLogger.create('My Application Name') do
    begin
      try
        LogMessage('Information Message!', EVENTLOG_INFORMATION_TYPE, 0, 1);
        LogMessage('Error Message!', EVENTLOG_ERROR_TYPE, 0, 2);
        LogMessage('Warning Message!', EVENTLOG_WARNING_TYPE, 0, 3);
        LogMessage('Audit Success Message!', EVENTLOG_AUDIT_SUCCESS, 0, 4);
        LogMessage('Audit Failure Message!', EVENTLOG_AUDIT_FAILURE, 0, 5);
      finally
        free;
      end;
    end;
    

Ich benutze Standard VCL für den in Delphi 6, kann ich Ihnen nicht sagen, ob dies in Delphi zur Verfügung 5. Sie es selbst versuchen und lassen Sie uns wissen, ob das Material dort in D5 ist.

  1. Deklarieren Sie ein globales / form-Variable vom Typ TEventLogger. Dies wird in der SvcMgr Einheit erklärt so das Gerät zu Ihrer uses-Liste werden muß hinzugefügt. Wenn dies eine normale Anwendung (das heißt keinen Service) dann stellen Sie sicher, SvcMgr nach der Forms Einheit hinzugefügt.

    MyEventLog: TEventLogger;

  2. Erstellen Sie eine Instanz des Loggers.

    MyEventLog: = TEventLogger.Create ( 'MyApplication');

  3. Um in das Ereignisprotokoll zu schreiben:

    MyEventLog.LogMessage ( 'MyApplication gestartet.'), EVENTLOG_INFORMATION_TYPE);

  4. Vergessen Sie nicht, es am Ende zu lösen:

    MyEventLog.Free;

Es gibt andere Dinge, die Sie tun müssen, um die Anwendung mit dem Windows-Ereignisprotokoll zu registrieren, so dass die Nachricht vor, ohne dies erscheint:

Die Beschreibung von Ereigniskennung (1000) in Quelle (Microsoft Internet Explorer) kann nicht gefunden werden. Der lokale Computer verfügt nicht über die erforderlichen Registrierungsinformationen oder DLL-Meldungsdateien Meldungen von einem Remotecomputer anzuzeigen. Die folgenden Informationen sind Teil des Ereignisses:

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top