Ho questo problema che devo risolvere per uno dei miei progetti. Ho bisogno di creare un file di log per 3 diversi servizi (non chiedere perché, il mio capo lo ha richiesto in questo modo). Ogni servizio può avere più thread cercando di registrare informazioni nel file, quindi la mia domanda è, qual è il modo migliore per farlo?Condividere un file di registro tra più servizi (ogni servizio con più thread), come?
Devo utilizzare un mutex globale? Qualcosa di simile a questo:
procedure LogToFile(fn, str: string);
var
F: TextFile;
begin
logMutex.Acquire;
try
{$I+}
try
AssignFile(F, fn);
if FileExists(fn) then
Append(F)
else
Rewrite(F);
Writeln(F, DateTimeToStr(Now) + ': ' + str);
CloseFile(F);
except
end;
{$I-}
finally
logMutex.Release;
end;
end;
initialization
logMutex := SyncObjs.TMutex.Create(nil, False,'some_global_mutex');
finalization
logMutex.Free;
un'idea migliore?
Modifica: Devo compilare un altro servizio, un servizio di registrazione, che attende i messaggi che devono essere registrati dagli altri servizi e solo un servizio deve gestire i file di registro? Se questa è una buona soluzione, qual è il modo migliore per comunicare tra i servizi? Potrei usare Indy ...
Prova CodeSite da http://www.raize.com/DevTools/CodeSite/Default.asp –
La mia azienda ha scritto il nostro servizio di registrazione. Utilizziamo un oggetto COM a thread libero per consentire alle app di inviare messaggi di registro al servizio, quindi accoda e scarica i messaggi nel file di registro in base alle esigenze. Si potrebbe anche considerare l'utilizzo di un registro eventi di sistema di Windows invece di un file di testo normale. Quindi le tue app possono inviare messaggi a tale registro tramite 'ReportEvent()' e lasciare che il sistema operativo gestisca il file di registro effettivo per te. –
Scriverò un servizio di logger separato, quindi utilizzerò il messaggio Window WM_COPYDATA per fare in modo che i vostri tre servizi inviino un messaggio. Soprattutto perché quel servizio di log può tenere aperto il file per accodarlo. L'apertura costante del file diventa lenta. Spiacente, non sono al punto in cui ho accesso al codice di esempio al momento. –