Question

Je cherche un moyen (assez sans douleur) d'ajouter une application Windows Event Log support à un petit héritage Delphi 5 application. Nous voulons juste de se connecter au démarrage-up, ferme vers le bas, ne parvient pas à se connecter à une base de données, etc.

Plusieurs des solutions / composants que j'ai vu semblent suggérer que nous aurons besoin de faire une DLL de ressource que le journal des événements Windows Viewer créer un lien vers lorsque vous essayez de lire nos « entrées ». Bien que cela ne semble pas trop lourd, je suppose que c'est autre chose à garder à l'esprit si / quand nous développons l'application à l'avenir - nous devons garder cette DLL à jour.

À un certain moment dans l'avenir, nous voulons transformer l'application en un service, probablement écrit dans D2007.

Ainsi peut-on recommander un itinéraire adapté à l'ajout d'événements dans le journal des événements dans D5? Je suis à la recherche spécifique « nous avons utilisé cela et il était correct » commentaires plutôt qu'un chalut Google (que je peux faire moi-même!) Gratuits ou payants, pour, vraiment ne me dérange pas - mais quelque chose que je pouvais migrer vers D2007 à l'avenir est important.

Était-ce utile?

La solution 4

Merci à J et les réponses de Pierre, je me suis mon code écrit dans le journal des événements tout de suite. Il y a un peu plus à faire, surtout si vous voulez que vos événements apparaissent « bien » dans le journal des événements sans fenêtres message standard de ne pas être en mesure de trouver la description (comme par le fond de J «post s).

J'ai suivi les conseils ici pour faire une DLL appropriée et en entrant dans le registre, et très rapidement a tout réglé.

était en Delphi5, selon la question, mais je n'ai rien vu qui me fait penser cela ne fonctionnerait pas aussi D2007.

Autres conseils

Résumé: L'écriture à l'aide de journal des événements de Windows Delphi


Si vous écrivez un service Windows et ont besoin d'écrire journal d'événements Windows de la machine locale, vous pouvez alors appeler TService. LogMessage comme mentionné .

//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;

Pour tout autre type d'applications que vous pouvez utiliser le SvcMgr. TEventLogger classe d'aide sans papier pour TService pour écrire le Windows de la machine locale du journal des événements comme mentionné ici , ici et .

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;

Vous pouvez également utiliser l'API Windows ReportEvent fonction telle que mentionnée ici et .

J'ai créé une classe simple pour la rendre plus facile, il est disponible sur GitHub .

//----------------- 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.

ReportEvent prend en charge l'écriture d'une entrée du journal soit une machine locale ou distante de journal des événements. Pour un exemple à distance voir EDN article John Kaster.


Notez que vous auriez aussi enregistrer votre source d'événement sinon tous vos messages journaux seront en commençant par quelque chose comme ceci:

  

La description de xxx ID d'événement de la source xxxx ne peut pas être   a trouvé. Soit le composant qui a déclenché cet événement est installé sur   votre ordinateur local ou l'installation est endommagée. Vous pouvez installer   ou réparer le composant sur l'ordinateur local.

     

Si l'événement est née sur un autre ordinateur, les informations d'affichage   a dû être sauvé avec l'événement.

     

Les informations suivantes ont été inclus à l'événement:

1, Pour plus d'informations sur la façon de créer un fichier de message voir tutoriel de Finn Tolderlund ou article Michael Hex ou vous pouvez utiliser un fichier MC et RES existant inclus dans le projet GitHub .

2, Intégrer le RES fichier dans votre application en incluant les MessageFile.res dans votre fichier RDP. Sinon, vous pouvez créer une dll pour les messages.

program MyTestApp;

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

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

begin
  Application.Initialize;

3, L'enregistrement une fois hors exige des droits d'administrateur d'écriture dans le registre il nous fait habituellement dans le cadre du processus d'installation de votre application.

//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;

Si vous avez besoin de la journalisation des événements Windows et d'autres exigences de journalisation, vous pouvez également utiliser des cadres d'exploitation tels que log4d et TraceTool


Voir si vous voulez écrire le journal des événements dans la fenêtre Delphi IDE.

Pour simple événement vous connecter D5, j'ai utilisé le code suivant pour ajouter des messages aux applications journal.

  • Ajouter "SvcMgr" à la clause uses
  • Utilisez ce code pour ajouter votre message texte et un numéro d'identification (dernier paramètre sur les lignes de logMessage)

    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;
    

J'utilise VCL standard pour cela dans Delphi 6, je ne peux pas vous dire si oui ou non il est disponible dans Delphi 5. Essayez-le pour vous et laissez-nous savoir si ce genre de choses est là dans D5.

  1. Déclarer une variable globale / forme de type TEventLogger. Ceci est déclaré dans l'unité SvcMgr donc cette unité devra être ajouté à votre liste d'utilisations. Si cela est une application normale (à savoir pas un service) puis assurez-vous SvcMgr est ajouté après l'unité Forms.

    MyEventLog: TEventLogger;

  2. Créer une instance de l'enregistreur.

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

  3. Pour écrire au journal des événements:

    MyEventLog.LogMessage (monapplication a commencé. »), EVENTLOG_INFORMATION_TYPE);

  4. Ne pas oublier de le libérer à la fin:

    MyEventLog.Free;

Il y a d'autres choses que vous devez faire pour enregistrer l'application avec le journal des événements Windows afin que le message apparaît sans cela devant elle:

ne peut pas trouver la description pour l'ID d'événement (1000) dans la source (Microsoft Internet Explorer). L'ordinateur local ne peut pas avoir les informations de Registre nécessaires ou les fichiers DLL de message pour afficher les messages d'un ordinateur distant. Les informations suivantes font partie de l'événement:

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top