diff --git a/SteamWareLib/logger.cs b/SteamWareLib/logger.cs index 35355e4..527a91d 100644 --- a/SteamWareLib/logger.cs +++ b/SteamWareLib/logger.cs @@ -1,5 +1,6 @@ using System; using System.IO; +using System.Threading; namespace SteamWare { @@ -10,8 +11,6 @@ namespace SteamWare { #region dichiarazione variabili - #region altri dati - /// /// directory base x logs /// @@ -28,9 +27,14 @@ namespace SteamWare /// controlla se si debba mantenere sotto controllo la dimensioen della cartella logs /// protected bool _doShrinkFolder; - - - #endregion + /// + /// Ultima verifica directory (x shrink) + /// + private static DateTime lastDirCheck; + /// + /// metodo gestione wirteLock su file log + /// + private static ReaderWriterLockSlim _readWriteLock = new ReaderWriterLockSlim(); #endregion @@ -63,6 +67,8 @@ namespace SteamWare { _doShrinkFolder = true; } + // all'avvio imposto ultimo check a 23 ore fa... così farà shrink DOPO 1 h da avvio + lastDirCheck = DateTime.Now.AddHours(-23); } /// /// livello di log applicazione (da web.config, chiave '_logLevel') @@ -181,25 +187,30 @@ namespace SteamWare return fatto; } /// - /// Vera chaimata scrittura log x override con gestione REDIS di calmierazione + /// Vera chiamata scrittura log x override con gestione REDIS di calmierazione /// /// /// private bool doScriviLog(string _testoPre) { + bool fatto = false; // attenzione: rimpiazzo eventuali "
" con newline... string _testo = string.Format("{0:H:mm:ss ffff} \t{1}", DateTime.Now, _testoPre.Replace("
", Environment.NewLine).Replace("
", Environment.NewLine).Replace("
", Environment.NewLine)); - - if (_doShrinkFolder) + // se è configurato x shrink ed è passato almeno 1 gg da ultimo check... + if (_doShrinkFolder && lastDirCheck.AddDays(1) < DateTime.Now) { // verifica dim directory ed eventualmente cancella... - opzionale shrinkDir(); + // salvo nuova ora di check + lastDirCheck = DateTime.Now; } // (ri)genera il nome del file di log... newLogfileName(); + // scrivo thread safe + fatto = WriteToFileThreadSafe(_logfileName, _testo); +#if false // aggiunge in append... StreamWriter sw = new StreamWriter(_logfileName, true); - bool fatto; try { sw.WriteLine(_testo); @@ -210,11 +221,39 @@ namespace SteamWare catch { fatto = false; - } - + } +#endif return fatto; } + /// + /// Esecuzione scrittura ThreadSafe + /// + /// + /// + public bool WriteToFileThreadSafe(string logPath, string text2write) + { + bool answ = false; + // Set Status to Locked + _readWriteLock.EnterWriteLock(); + try + { + // Append text to the file + using (StreamWriter sw = File.AppendText(logPath)) + { + sw.WriteLine(text2write); + sw.Close(); + answ = true; + } + } + finally + { + // Release lock + _readWriteLock.ExitWriteLock(); + } + return answ; + } + /// /// scrive un messaggio di log con etichetta pre ///