diff --git a/Jenkinsfile b/Jenkinsfile
index cb208c2..28f3775 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=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'
}
}
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 67ec0c6..b0e5cba 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
@@ -48,7 +52,7 @@ namespace SteamWare
{
try
{
- _logBaseDir = SteamwareStrings.getFilePath(memLayer.ML.CRS("_logDir"));
+ _logBaseDir = SteamwareStrings.getFilePath(memLayer.ML.confReadString("_logDir"));
}
catch
{
@@ -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')
@@ -116,19 +122,95 @@ namespace SteamWare
///
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 > 100)
+ {
+ hKey = hKey.Substring(0, 100);
+ }
+ 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.confReadString("logMitigSec") != "")
+ {
+ logMitigSec = memLayer.ML.confReadInt("logMitigSec");
+ }
+ }
+ catch
+ { }
+ // 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(), logMitigSec);
+ // 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 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);
@@ -139,9 +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
///
diff --git a/SteamWareLib/memLayer.cs b/SteamWareLib/memLayer.cs
index 96355b9..d6e73f3 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)
@@ -196,8 +197,17 @@ 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);
return answ;
}
///
@@ -238,7 +248,7 @@ namespace SteamWare
}
if (AppConf != null)
{
- // controllo se ho dati (sennò rileggo)
+ // controllo se ho dati (senn� rileggo)
if (AppConf.Count == 0)
{
resetAppConf();
@@ -251,9 +261,9 @@ 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...
+ // controllo SE � passato pi� di 5 minuti, nel caso faccio refresh...
if (DateTime.Now.Subtract(lastUpdateAppConf).TotalMinutes > maxAge)
{
resetAppConf();
@@ -292,7 +302,7 @@ namespace SteamWare
}
catch (Exception exc)
{
- logger.lg.scriviLog("Errore in cdvb x chiave [" + chiave + "]: " + exc.ToString(), tipoLog.EXCEPTION);
+ logger.lg.scriviLog(string.Format("Errore in lettura chiave [{0}] durante cdvb{1}{2}", chiave, Environment.NewLine, exc), tipoLog.EXCEPTION);
}
return answ;
}
@@ -310,7 +320,7 @@ namespace SteamWare
}
catch (Exception exc)
{
- logger.lg.scriviLog("Errore in cdvi x chiave [" + chiave + "]: " + 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;
}
@@ -801,7 +811,7 @@ namespace SteamWare
}
///
- /// restituisce true se è presente in session l'oggetto richiesto
+ /// restituisce true se � presente in session l'oggetto richiesto
///
///
///
@@ -1095,7 +1105,7 @@ namespace SteamWare
}
///
- /// restituisce true se è presente in cache l'oggetto richiesto
+ /// restituisce true se � presente in cache l'oggetto richiesto
///
///
///