Journal d'événements Windows Montage ultérieur d'une application Delphi 5
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.
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.
-
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;
-
Créer une instance de l'enregistreur.
MyEventLog: = TEventLogger.Create ( 'MyApplication');
-
Pour écrire au journal des événements:
MyEventLog.LogMessage (monapplication a commencé. »), EVENTLOG_INFORMATION_TYPE);
-
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: