2009-11-13 16 views
8

Ho diversi processi in esecuzione contemporaneamente che voglio accedere allo stesso file.Registrazione da più processi allo stesso file utilizzando Enterprise Library 4.1

Abbiamo utilizzato Application Library 4.1 Logging Application Block (con un RollingFlatFileTraceListener) e funziona correttamente, a parte il fatto che antepone un GUID al nome del file di registro quando due processi tentano di scrivere nel file di registro in allo stesso tempo (una stranezza di System.Diagnostics.TextWriterTraceListener credo).

Ho provato varie cose, incluso chiamare Logger.Writer.Dispose() dopo aver scritto nel file di registro, ma non è l'ideale per effettuare una chiamata di blocco ogni volta che viene scritta una voce di registro.

I forum EntLib suggeriscono di utilizzare MSMQ con un servizio di distribuzione, ma questa non è un'opzione in quanto MSMQ non è consentito nella mia azienda.

Esiste un altro modo per accedere rapidamente e facilmente da più thread/processi allo stesso file?

+0

hai ricevuto una soluzione alternativa? forse usando *** MSMQ ***? – Kiquenet

+0

@Kiquenet è passato tanto tempo, non riesco a ricordare. Se ci provo davvero, ricordo vagamente che abbiamo finito con l'uso di file di registro diversi per processi diversi per ovviare a questo problema. Non è l'ideale, ma volevamo mantenere le cose semplici. – Riko

+0

Potrei aggiungere se dovessi scegliere un framework di registrazione ora, starei il più lontano possibile da Enterprise Library. È troppo complesso, sia da usare che da configurare, e non facilmente estendibile. Probabilmente andrei con [log4net] (https://logging.apache.org/log4net/) o [NLog] (http://nlog-project.org/). – Riko

risposta

4

Mi spiace dirlo ma la risposta è no. File TraceListeners blocca il file di output in modo che solo un TraceListener possa accedere a un file.

È possibile provare altri ascoltatori di traccia che non sono basati su file (ad esempio database, registro eventi).

Un'altra opzione che posso pensare sarebbe scrivere il proprio servizio di registrazione (fuori processo) che acceda al file e accetta LogEntries. Quindi creare un listener di traccia personalizzato che invii un messaggio al servizio.

Potrebbe non essere una buona idea dato che avresti un po 'di sviluppo personalizzato e potrebbe avere un impatto sulle prestazioni poiché è una chiamata fuori processo. Fondamentalmente stai configurando il tuo servizio pseudo-distributore semplificato.

+0

Questa è la stessa conclusione che abbiamo raggiunto. A lungo termine scriveremo probabilmente un semplice servizio WCF fire-and-forget per la registrazione, sembra l'unica altra opzione praticabile. Peccato però. – Riko

2

EntLib blocca il file di registro quando viene scritto su di esso. Pertanto, 2 processi non possono scrivere nello stesso file di registro.

Quando abbiamo riscontrato questo problema, abbiamo dovuto effettuare il log da molti punti di differenza, nello stesso luogo, abbiamo utilizzato la registrazione del database.

Se si è bloccati al 100% la registrazione in un file di testo, è possibile accedere a singoli file di registro e quindi scrivere un programma per unire questi file.

+0

Anche 2 ascoltatori di tracce separati nello stesso processo non possono accedere allo stesso file. –

+0

Sì, la registrazione del database non è un'opzione per noi, non ne abbiamo uno.Per il momento stiamo davvero andando con i singoli file di log che uniamo insieme. Ma questa sarà solo una soluzione temporanea a breve termine. – Riko

1

So che questo è vecchio, ma se sei ancora curioso. log4net supporta:

http://logging.apache.org/log4net/release/faq.html#How do I get multiple process to log to the same file?
+1

Grazie. L'utilizzo di log4net su questo progetto non era un'opzione. Se fosse la mia decisione lo userò sicuramente su EntLib, però, il logging di EntLib è troppo gonfio e difficile da capire. – Riko

0

Il problema si verifica quando il pool di app ricicla e consente di sovrapporre i thread. Il thread di chiusura è ancora aperto e il nuovo thread ottiene l'errore. Prova a disabilitare il comportamento di riciclaggio sovrapposto in IIS o crea la tua versione del writer di testo.

Problemi correlati