2012-11-15 14 views
9

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

+3

Prova CodeSite da http://www.raize.com/DevTools/CodeSite/Default.asp –

+1

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

+1

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

risposta

3

La soluzione che utilizza un mutex denominato funzionerà e rappresenta sicuramente l'approccio più semplice.

2

In un grande progetto con circa 50-80 applicazioni in esecuzione su più Terminal Server (che rende difficile la sincronizzazione), sono riuscito a raccogliere tutti gli output di registro in un singolo file centrale.

Le app scrivono l'output del registro su un server applicazioni su UDP, utilizzando l'open source Log4D framework e Internet Direct (Indy). Il server delle applicazioni ha un'app del server UDP in esecuzione che riceve i messaggi del registro e li scrive in un singolo file.

Poiché i messaggi di registro includono meta informazioni (nome del logger ecc.), Il server di registrazione può ancora essere configurato per scrivere file separati per applicazione, oltre al file principale. Ad esempio, alcuni messaggi di registro inviati dai client contengono dati sulle prestazioni del database, verranno scritti in un file di registro separato per essere pronti per l'analisi senza ulteriori passaggi di filtro.

Problemi correlati