diff --git a/SteamWareLib/logger.cs b/SteamWareLib/logger.cs index e0fb7cc..82427a8 100644 --- a/SteamWareLib/logger.cs +++ b/SteamWareLib/logger.cs @@ -62,6 +62,16 @@ namespace SteamWare { #region dichiarazione variabili + /// + /// metodo gestione wirteLock su file log + /// + private static ReaderWriterLockSlim _readWriteLock = new ReaderWriterLockSlim(); + + /// + /// Ultima verifica directory (x shrink) + /// + private static DateTime lastDirCheck; + /// /// controlla se si debba mantenere sotto controllo la dimensioen della cartella logs /// @@ -87,16 +97,6 @@ namespace SteamWare /// protected bool enableDumpDiag = false; - /// - /// metodo gestione wirteLock su file log - /// - private static ReaderWriterLockSlim _readWriteLock = new ReaderWriterLockSlim(); - - /// - /// Ultima verifica directory (x shrink) - /// - private static DateTime lastDirCheck; - #endregion dichiarazione variabili #region metodi esposti @@ -179,6 +179,91 @@ namespace SteamWare } } + /// + /// 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)); + // 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); + return fatto; + } + + /// + /// Effettua verifica e pulizia eventuali vecchi messaggi errore... + /// + private void purgeOldVeto() + { + // limite minimo di chaivi salvate per cui procedere coi controlli + int checkLimit = 100; + // limito cleanup x avere un operazione graduale... + int maxCleanup = checkLimit / 2; + // parto recuperando i valori VETO.... se > 100... + string redKeyCounters = memLayer.ML.redHash("Logger:Counter:*"); + string redLastCheck = memLayer.ML.redHash("Logger:CheckLock"); + // se non ho un veto check... + if (string.IsNullOrEmpty(memLayer.ML.getRSV(redLastCheck))) + { + memLayer.ML.setRSV(redLastCheck, "LOCK", 10); + int numCount = memLayer.ML.redCountKey(redKeyCounters); + if (numCount > checkLimit) + { + var redKeysList2check = memLayer.ML.redGetKeys(redKeyCounters); + foreach (var item in redKeysList2check) + { + // cerco il duale... se NON lo trovo + if (!memLayer.ML.redHashPresentSz(item.ToString().Replace(":Logger:Counter:", ":Logger:Veto:"))) + { + //// loggo! + //doScriviLog(item); + // elimino... + memLayer.ML.redDelKey(item); + maxCleanup--; + } + if (maxCleanup <= 0) + { + break; + } + } + } + } + } + + /// + /// formatta un blococ di diagnostica (titolo, contenuto / eccezione) + /// + /// + /// + /// + protected string formDiagBlock(string titolo, string contenuto) + { + string answ = SteamwareStrings.charTitle(titolo, '-', 60); + try + { + answ += SteamwareStrings.addLine(contenuto); + } + catch + { + answ += string.Format("Errore diagnostica {0}", titolo); + } + return answ; + } + /// /// Restituisce il numero di chiavi di vedo e di chiavi di count ative /// @@ -449,89 +534,29 @@ namespace SteamWare return answ; } - /// - /// formatta un blococ di diagnostica (titolo, contenuto / eccezione) - /// - /// - /// - /// - protected string formDiagBlock(string titolo, string contenuto) - { - string answ = SteamwareStrings.charTitle(titolo, '-', 60); - try - { - answ += SteamwareStrings.addLine(contenuto); - } - catch - { - answ += string.Format("Errore diagnostica {0}", titolo); - } - return answ; - } - - /// - /// 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)); - // 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); - return fatto; - } - - /// - /// Effettua verifica e pulizia eventuali vecchi messaggi errore... - /// - private void purgeOldVeto() - { - // limite minimo di chaivi salvate per cui procedere coi controlli - int checkLimit = 100; - // limito cleanup x avere un operazione graduale... - int maxCleanup = checkLimit / 2; - // parto recuperando i valori VETO.... se > 100... - string redKeyCounters = memLayer.ML.redHash("Logger:Counter:*"); - int numCount = memLayer.ML.redCountKey(redKeyCounters); - if (numCount > checkLimit) - { - var redKeysList2check = memLayer.ML.redGetKeys(redKeyCounters); - foreach (StackExchange.Redis.RedisKey item in redKeysList2check) - { - // cerco il duale... se NON lo trovo - if (!memLayer.ML.redHashPresentSz(item.ToString().Replace(":Logger:Counter:", ":Logger:Veto:"))) - { - // loggo! - doScriviLog(item); - // elimino... - memLayer.ML.redDelKey(item); - maxCleanup--; - } - if (maxCleanup <= 0) - { - break; - } - } - } - } - #endregion metodi esposti #region metodi privati + private void compressAndRemove(FileInfo[] _fis) + { + foreach (FileInfo _file in _fis) + { + if (_file.CreationTime < DateTime.Now.AddDays(-2)) // zippo files + vecchi di 2 gg... + { + fileMover.obj.zippaSingoloFile(_file); + // cancello l'originale... + fileMover.obj.eliminaFile(_file); + } + } + // verifico directory e dimensione... + while (fileMover.obj.totalMb() > _logMaxMb) + { + // cancello i + vecchi fino a rientrare alla dimensione max... + fileMover.obj.deleteOldest(); + } + } + /// /// fornisce il file + vecchio /// @@ -576,25 +601,6 @@ namespace SteamWare compressAndRemove(_fis); } - private void compressAndRemove(FileInfo[] _fis) - { - foreach (FileInfo _file in _fis) - { - if (_file.CreationTime < DateTime.Now.AddDays(-2)) // zippo files + vecchi di 2 gg... - { - fileMover.obj.zippaSingoloFile(_file); - // cancello l'originale... - fileMover.obj.eliminaFile(_file); - } - } - // verifico directory e dimensione... - while (fileMover.obj.totalMb() > _logMaxMb) - { - // cancello i + vecchi fino a rientrare alla dimensione max... - fileMover.obj.deleteOldest(); - } - } - #endregion metodi privati } } \ No newline at end of file diff --git a/TestBench/MainFOrm.cs b/TestBench/MainFOrm.cs index 5f4596a..18bcded 100644 --- a/TestBench/MainFOrm.cs +++ b/TestBench/MainFOrm.cs @@ -12,6 +12,8 @@ namespace TestBench { public partial class MainForm : Form { + #region Private Fields + /// /// Oggetto REDIS /// @@ -19,14 +21,30 @@ namespace TestBench private StackExchange.Redis.ISubscriber subscriber; + #endregion Private Fields + + #region Public Constructors + public MainForm() { InitializeComponent(); myInitComponent(); } + #endregion Public Constructors + + + + #region Private Delegates + private delegate void SetTextCallback(string text); + #endregion Private Delegates + + + + #region Private Methods + private void actionTimer_Tick(object sender, EventArgs e) { // processo le varie azioni... @@ -136,9 +154,14 @@ namespace TestBench private void chkTestLogger_CheckedChanged(object sender, EventArgs e) { if (chkTestLogger.Checked) + { + LogTimer.Interval = 50; LogTimer.Start(); + } else + { LogTimer.Stop(); + } } private void clockTimer_Tick(object sender, EventArgs e) @@ -252,5 +275,7 @@ namespace TestBench lblQueueRead.Text = $"{myRedis.ListPop(myKey)}{Environment.NewLine}{lblQueueRead.Text}"; } } + + #endregion Private Methods } } \ No newline at end of file