From 145e9143ee90a56397135f0bb8d9b0d27a0ab7b1 Mon Sep 17 00:00:00 2001 From: "Samuele E. Locatelli" Date: Fri, 26 Oct 2018 08:48:02 +0200 Subject: [PATCH 1/8] fix confReadString x LogDir --- SteamWareLib/logger.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SteamWareLib/logger.cs b/SteamWareLib/logger.cs index 67ec0c6..4632530 100644 --- a/SteamWareLib/logger.cs +++ b/SteamWareLib/logger.cs @@ -48,7 +48,7 @@ namespace SteamWare { try { - _logBaseDir = SteamwareStrings.getFilePath(memLayer.ML.CRS("_logDir")); + _logBaseDir = SteamwareStrings.getFilePath(memLayer.ML.confReadString("_logDir")); } catch { @@ -57,7 +57,7 @@ namespace SteamWare _logMaxMb = 100; // di default 100 mb... try { - _doShrinkFolder = memLayer.ML.CRB("doShrinkFolder"); + _doShrinkFolder = memLayer.ML.confReadBool("doShrinkFolder"); } catch { From 718d39d81b9911da4ec39c25d8690913b512d969 Mon Sep 17 00:00:00 2001 From: "Samuele E. Locatelli" Date: Fri, 26 Oct 2018 10:37:56 +0200 Subject: [PATCH 2/8] Gestione avanzata logger: con REDIS salvo ogni 30 sec NUM ERRORI uguali --- SteamWareLib/logger.cs | 62 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/SteamWareLib/logger.cs b/SteamWareLib/logger.cs index 4632530..a2158de 100644 --- a/SteamWareLib/logger.cs +++ b/SteamWareLib/logger.cs @@ -115,6 +115,66 @@ namespace SteamWare /// testo iniziale del log /// public bool scriviLog(string _testoPre) + { + bool needWrite = false; + bool fatto = false; + // preparo hash redis + string hKey = _testoPre.Replace(":", "_").Replace("/", "_").Replace("#", "_").Replace("|", "_").Replace(" ", "_").Replace("__", "_").Replace("__", "_").Replace("__", "_").Replace("__", "_"); + //se troppo lunga trimmo... + if (hKey.Length > 50) + { + hKey = hKey.Substring(0, 50); + } + string hVetoErrore = memLayer.ML.redHash("Logger:Veto:" + hKey); + string hCountErrore = memLayer.ML.redHash("Logger:Counter:" + hKey); + bool redisEnabled = memLayer.ML.confReadBool("cacheOnRedis"); + // verifico SE HO redis (in quel caso gli errori li loggo 1 volta poi metto un VETO ed un counter) + if (redisEnabled) + { + // cerco se ho un veto precedente in redis + string vetoPar = memLayer.ML.getRSV(hVetoErrore); + if (vetoPar != null && vetoPar != "") + { + needWrite = false; + } + else + { + // metto veto per TTL default... (durata std = 30 sec) + memLayer.ML.setRSV(hVetoErrore, DateTime.UtcNow.ToString(), 30); + // abilito log... + needWrite = true; + } + memLayer.ML.setRCntI(hCountErrore); + } + else + { + // altrimenti log direttamente + needWrite = true; + } + // se devo DAVVERO scrivere + if (needWrite) + { + if (redisEnabled) + { + int numRep = memLayer.ML.getRCnt(hCountErrore); + if (numRep > 1) + { + // cambio messaggio con un inizio pari al num di ripetizioni... + _testoPre = string.Format("{0} x {1}", numRep, _testoPre); + } + // reset counter + memLayer.ML.resetRCnt(hCountErrore); + } + fatto = doScriviLog(_testoPre); + } + return fatto; + } + /// + /// Vera chaimata scrittura log x override con gestione REDIS di calmierazione + /// + /// + /// + private bool doScriviLog(string _testoPre) { // 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)); @@ -140,8 +200,10 @@ namespace SteamWare { fatto = false; } + return fatto; } + /// /// scrive un messaggio di log con etichetta pre /// From 7840ccd75f70ec0358219a6654352ddc033e5ced Mon Sep 17 00:00:00 2001 From: "Samuele E. Locatelli" Date: Fri, 26 Oct 2018 10:45:37 +0200 Subject: [PATCH 3/8] Ulteriore fix + release nuova vers dll --- Jenkinsfile | 6 +++--- SteamWareLib/logger.cs | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index cb208c2..bef598f 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -10,9 +10,9 @@ pipeline { steps { /* calcolo numero versione... diverso x branch MASTER/DEVELOP */ script { - withEnv(['NEXT_BUILD_NUMBER=626']) { - // env.versionNumber = VersionNumber(versionNumberString : '3.1.${BUILD_DATE_FORMATTED, "yyMM"}.${BUILDS_ALL_TIME}', projectStartDate : '2006-01-01', skipFailedBuilds: true) - env.versionNumber = VersionNumber(versionNumberString : '3.1.${BUILD_DATE_FORMATTED, "yyMM"}.${BUILDS_ALL_TIME}', projectStartDate : '2006-01-01', skipFailedBuilds: true, overrideBuildsAllTime: '${NEXT_BUILD_NUMBER}') + withEnv(['NEXT_BUILD_NUMBER=629']) { + // env.versionNumber = VersionNumber(versionNumberString : '3.2.${BUILD_DATE_FORMATTED, "yyMM"}.${BUILDS_ALL_TIME}', projectStartDate : '2006-01-01', skipFailedBuilds: true) + env.versionNumber = VersionNumber(versionNumberString : '3.2.${BUILD_DATE_FORMATTED, "yyMM"}.${BUILDS_ALL_TIME}', projectStartDate : '2006-01-01', skipFailedBuilds: true, overrideBuildsAllTime: '${NEXT_BUILD_NUMBER}') env.APP_NAME = 'SteamWareLib' } } diff --git a/SteamWareLib/logger.cs b/SteamWareLib/logger.cs index a2158de..389a23a 100644 --- a/SteamWareLib/logger.cs +++ b/SteamWareLib/logger.cs @@ -121,9 +121,9 @@ namespace SteamWare // preparo hash redis string hKey = _testoPre.Replace(":", "_").Replace("/", "_").Replace("#", "_").Replace("|", "_").Replace(" ", "_").Replace("__", "_").Replace("__", "_").Replace("__", "_").Replace("__", "_"); //se troppo lunga trimmo... - if (hKey.Length > 50) + if (hKey.Length > 100) { - hKey = hKey.Substring(0, 50); + hKey = hKey.Substring(0, 100); } string hVetoErrore = memLayer.ML.redHash("Logger:Veto:" + hKey); string hCountErrore = memLayer.ML.redHash("Logger:Counter:" + hKey); From bf8e810f27857a162e7ed6e247a4b46e3fe1ecbf Mon Sep 17 00:00:00 2001 From: "Samuele E. Locatelli" Date: Fri, 26 Oct 2018 17:55:59 +0200 Subject: [PATCH 4/8] Fix fallback errore gestione log mitigato --- SteamWareLib/devicesAuthProxy.cs | 2 +- SteamWareLib/logger.cs | 15 +++++++++++++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/SteamWareLib/devicesAuthProxy.cs b/SteamWareLib/devicesAuthProxy.cs index 393b757..83c3755 100644 --- a/SteamWareLib/devicesAuthProxy.cs +++ b/SteamWareLib/devicesAuthProxy.cs @@ -283,7 +283,7 @@ namespace SteamWare // calcolo il secret... DateTime adesso = DateTime.Now; string Secret = string.Format("{0}|{1}|{2}", email, DeviceName, adesso); - string devSecret = SteamCrypto.EncryptString(Secret, passphrase(memLayer.ML.CRS("CodModulo"), UserAuthKey)); + string devSecret = SteamCrypto.EncryptString(Secret, passphrase(memLayer.ML.confReadString("CodModulo"), UserAuthKey)); try { // registro chiave x il device diff --git a/SteamWareLib/logger.cs b/SteamWareLib/logger.cs index 389a23a..35355e4 100644 --- a/SteamWareLib/logger.cs +++ b/SteamWareLib/logger.cs @@ -57,7 +57,7 @@ namespace SteamWare _logMaxMb = 100; // di default 100 mb... try { - _doShrinkFolder = memLayer.ML.confReadBool("doShrinkFolder"); + _doShrinkFolder = memLayer.ML.CRB("doShrinkFolder"); } catch { @@ -128,6 +128,17 @@ namespace SteamWare string hVetoErrore = memLayer.ML.redHash("Logger:Veto:" + hKey); string hCountErrore = memLayer.ML.redHash("Logger:Counter:" + hKey); bool redisEnabled = memLayer.ML.confReadBool("cacheOnRedis"); + // verifico mitigazione + int logMitigSec = 30; + try + { + if (memLayer.ML.CRS("logMitigSec") != "") + { + logMitigSec = memLayer.ML.CRI("logMitigSec"); + } + } + catch + { } // verifico SE HO redis (in quel caso gli errori li loggo 1 volta poi metto un VETO ed un counter) if (redisEnabled) { @@ -140,7 +151,7 @@ namespace SteamWare else { // metto veto per TTL default... (durata std = 30 sec) - memLayer.ML.setRSV(hVetoErrore, DateTime.UtcNow.ToString(), 30); + memLayer.ML.setRSV(hVetoErrore, DateTime.UtcNow.ToString(), logMitigSec); // abilito log... needWrite = true; } From 0798b5ee61eb9f6f1089f89a91e12b86b435e694 Mon Sep 17 00:00:00 2001 From: "Samuele E. Locatelli" Date: Tue, 6 Nov 2018 10:59:13 +0100 Subject: [PATCH 5/8] Modifica classe logger x evitare sovrapposizioni thread x MP-IO --- SteamWareLib/logger.cs | 61 ++++++++++++++++++++++++++++++++++-------- 1 file changed, 50 insertions(+), 11 deletions(-) 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 /// From 6cda6eca07edcb6525bf06acdf6845786b42d7c5 Mon Sep 17 00:00:00 2001 From: "Samuele E. Locatelli" Date: Fri, 9 Nov 2018 12:25:18 +0100 Subject: [PATCH 6/8] migliorato logging in procedura CDV... --- SteamWareLib/memLayer.cs | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/SteamWareLib/memLayer.cs b/SteamWareLib/memLayer.cs index 4c1370c..a6f34ad 100644 --- a/SteamWareLib/memLayer.cs +++ b/SteamWareLib/memLayer.cs @@ -162,6 +162,7 @@ namespace SteamWare } redSaveHash(ACBH, valori); lastUpdateAppConf = DateTime.Now; + logger.lg.scriviLog("Completato procedura startupAppConf ", tipoLog.INFO); } } catch (Exception exc) @@ -198,6 +199,8 @@ namespace SteamWare { answ.Add(riga.chiave, riga.valore); } + // log ricarica + logger.lg.scriviLog(string.Format("Effettuata procedura ricaricaAppConf per {0} records", answ.Count), tipoLog.INFO); return answ; } /// @@ -251,7 +254,7 @@ namespace SteamWare } catch (Exception exc) { - logger.lg.scriviLog("Errore configDbVal: " + exc.ToString(), tipoLog.EXCEPTION); + logger.lg.scriviLog(string.Format("Errore in lettura chiave [{0}] durante configDbVal{1}{2}", chiave, Environment.NewLine, exc), tipoLog.EXCEPTION); } // controllo SE è passato più di 5 minuti, nel caso faccio refresh... if (DateTime.Now.Subtract(lastUpdateAppConf).TotalMinutes > maxAge) @@ -290,8 +293,10 @@ namespace SteamWare { answ = Convert.ToBoolean(configDbVal(chiave)); } - catch - { } + catch (Exception exc) + { + logger.lg.scriviLog(string.Format("Errore in lettura chiave [{0}] durante cdvb{1}{2}", chiave, Environment.NewLine, exc), tipoLog.EXCEPTION); + } return answ; } /// @@ -308,7 +313,7 @@ namespace SteamWare } catch (Exception exc) { - logger.lg.scriviLog("errore in cdvi: " + exc.ToString(), tipoLog.EXCEPTION); + logger.lg.scriviLog(string.Format("Errore in lettura chiave [{0}] durante cdvi{1}{2}", chiave, Environment.NewLine, exc), tipoLog.EXCEPTION); } return answ; } @@ -1135,9 +1140,9 @@ namespace SteamWare { Dictionary answ = new Dictionary(); var cacheVal = objCacheObj("tabelleInCache"); - if(cacheVal!=null) + if (cacheVal != null) { - answ= (Dictionary)cacheVal; + answ = (Dictionary)cacheVal; } return answ; } From 26d07b051a88859648afcfbdbfca51859291838f Mon Sep 17 00:00:00 2001 From: "Samuele E. Locatelli" Date: Fri, 9 Nov 2018 15:38:41 +0100 Subject: [PATCH 7/8] Fix fasi di startup + log iniziale config da DB --- SteamWareLib/logger.cs | 4 ++-- SteamWareLib/memLayer.cs | 9 ++++++++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/SteamWareLib/logger.cs b/SteamWareLib/logger.cs index 527a91d..b0e5cba 100644 --- a/SteamWareLib/logger.cs +++ b/SteamWareLib/logger.cs @@ -138,9 +138,9 @@ namespace SteamWare int logMitigSec = 30; try { - if (memLayer.ML.CRS("logMitigSec") != "") + if (memLayer.ML.confReadString("logMitigSec") != "") { - logMitigSec = memLayer.ML.CRI("logMitigSec"); + logMitigSec = memLayer.ML.confReadInt("logMitigSec"); } } catch diff --git a/SteamWareLib/memLayer.cs b/SteamWareLib/memLayer.cs index a6f34ad..cf6184b 100644 --- a/SteamWareLib/memLayer.cs +++ b/SteamWareLib/memLayer.cs @@ -197,7 +197,14 @@ namespace SteamWare Dictionary answ = new Dictionary(); foreach (DS_Utility.ConfigRow riga in taConfig.GetData()) { - answ.Add(riga.chiave, riga.valore); + try + { + answ.Add(riga.chiave, riga.valore); + } + catch + { + logger.lg.scriviLog(string.Format("Errore procedura ricaricaAppConf per kvp: {0} / {1}", riga.chiave, riga.valore), tipoLog.INFO); + } } // log ricarica logger.lg.scriviLog(string.Format("Effettuata procedura ricaricaAppConf per {0} records", answ.Count), tipoLog.INFO); From acc4733fbe630d82223162b6fbb78c3fecddb5d1 Mon Sep 17 00:00:00 2001 From: "Samuele E. Locatelli" Date: Sat, 10 Nov 2018 11:48:49 +0100 Subject: [PATCH 8/8] Refresh vers steamwarelibs --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index bef598f..28f3775 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -10,7 +10,7 @@ pipeline { steps { /* calcolo numero versione... diverso x branch MASTER/DEVELOP */ script { - withEnv(['NEXT_BUILD_NUMBER=629']) { + withEnv(['NEXT_BUILD_NUMBER=631']) { // env.versionNumber = VersionNumber(versionNumberString : '3.2.${BUILD_DATE_FORMATTED, "yyMM"}.${BUILDS_ALL_TIME}', projectStartDate : '2006-01-01', skipFailedBuilds: true) env.versionNumber = VersionNumber(versionNumberString : '3.2.${BUILD_DATE_FORMATTED, "yyMM"}.${BUILDS_ALL_TIME}', projectStartDate : '2006-01-01', skipFailedBuilds: true, overrideBuildsAllTime: '${NEXT_BUILD_NUMBER}') env.APP_NAME = 'SteamWareLib'