2012-11-29 20 views
7

Ho sviluppato un servizio Windows in cui sto usando un controllo timer per eseguire alcune attività programmate. L'evento di durata del timer si verifica ogni 5 minuti in cui viene effettuata una voce di registro utilizzando l'appender log4net nel database Oracle.log4net Adonet Appender Connection Edizione

Tutto funziona correttamente finché il server DB non chiude tutte le connessioni per il backup notturno a freddo. Da quel momento tutti i log in DB vengono persi e non viene registrato nulla a meno che il servizio non venga riavviato anche se il processo di backup richiede meno di 30 minuti.

Da altri post ho trovato che log4net utilizza solo una connessione che se viene persa, tutti i registri successivi vengono scartati. Per rimediare a questo ho iniziato a utilizzare l'attributo ReconnectOnError impostato come true nella sua configurazione. Ma sfortunatamente, il problema è ancora lì. I log sono ancora mancanti dopo il backup. Ho abilitato la traccia e ho rilevato gli errori seguenti, ma non so come risolvere questo problema.

log4net: ERRORE [CustomAdoNetAppender] Eccezione durante la scrittura nel database Oracle.DataAccess.Client.OracleException ORA-03113: end-of-file sul canale di comunicazione a Oracle.DataAccess.Client.OracleException.HandleErrorHelper (Int32 errCode , OracleConnection conn, IntPtr opsErrCtx, OpoSqlValCtx * pOpoSqlValCtx, oggetto src, procedura String) a Oracle.DataAccess.Client.OracleException.HandleError (Int32 errCode, OracleConnection conn, procedura String, IntPtr opsErrCtx, OpoSqlValCtx * pOpoSqlValCtx, Object src) a Oracle.DataAccess.Client.OracleCommand.ExecuteNonQuery() a log4net.Appender.AdoNetAppender.SendBuffer (IDbTransaction dbTran, LoggingEvent [] eventi) a log4net.Appender.AdoNetAppender.SendBuffer (LoggingEvent [] eventi)

e:

log4net: ERRORE [CustomAdoNetAppender] Eccezione durante la scrittura nel database System.InvalidOperationException: Il collegamento è già parte del una transazione locale o distribuita in Oracle.DataAccess.Client.OracleConnection.BeginTransaction (IsolationLevel isolationLevel) in Oracle.DataAccess.Client.OracleConnection.BeginDbTransaction (IsolationLevel isolationLevel) in System.Data.Common.DbConnection.System.Data. IDbConnection.BeginT ransaction() a log4net.Appender.AdoNetAppender.SendBuffer (LoggingEvent [] eventi)

Qualsiasi aiuto su questo molto apprezzato !!

risposta

3

Personalmente lo considero un bug in AdnetNet.

In log4net 1.2.11 AdoNetAppender commette il peccato principale di mantenere una connessione aperta anziché utilizzare il pool di connessioni.

anche l'opzione ReconnectOnError sembra rotto: tenta solo di riconnettersi se lo stato di connessione corrente non è ConnectionState.Open, che sembra sbagliato: non credo che la connessione cambiamenti di stato quando si è verificato un errore (il valore enum ConnectionState.Broken è documentato in MSDN come riservato per le versioni future del prodotto).

Tutto sommato, consiglierei di implementare il proprio appender personalizzato che esegue correttamente il pooling delle connessioni. Non è una classe molto grande, quindi sarebbe facile da duplicare e risolvere.

+0

Grazie per la risposta. È possibile rilevare eccezioni log4net da qualche parte o in Custom Appender? – Lucky