using System; using System.IO; namespace SteamWare { /// /// classe gesione log files applicazioni /// public class logger { #region dichiarazione variabili #region altri dati /// /// directory base x logs /// protected string _logBaseDir; /// /// nome del file corrente /// protected string _logfileName; /// /// max mb di log da accumulare /// protected int _logMaxMb; /// /// controlla se si debba mantenere sotto controllo la dimensioen della cartella logs /// protected bool _doShrinkFolder; #endregion #endregion #region metodi esposti /// /// singleton del logger /// public static logger lg = new logger(); /// /// avvio del logger nella dir desiderata /// public logger() { try { _logBaseDir = SteamwareStrings.getFilePath(memLayer.ML.CRS("_logDir")); } catch { _logBaseDir = memLayer.ML.CRS("logLocalDir"); } _logMaxMb = 100; // di default 100 mb... try { _doShrinkFolder = memLayer.ML.CRB("doShrinkFolder"); } catch { _doShrinkFolder = true; } } /// /// livello di log applicazione (da web.config, chiave '_logLevel') /// public int logLevel { get { int answ = -1; try { answ = memLayer.ML.CRI("_logLevel"); } catch { scriviLog("non ho trovato chiave di registro x logLevel...", tipoLog.ERROR); } return answ; } } /// /// avvio del logger nella dir desiderata /// public logger(string _baseDir) { _logBaseDir = _baseDir; _logMaxMb = 40; // di default 40 mb... } /// /// avvio del logger nella dir desiderata con il max di dati indicato /// public logger(string _baseDir, int _logMaxMB) { _logBaseDir = _baseDir; _logMaxMb = _logMaxMB; } /// /// resetta il logfile odierno /// public void resetLogFile() { newLogfileName(); FileInfo fi = new FileInfo(_logfileName); fi.Delete(); scriviLog("ResetFile", tipoLog.STARTUP); } /// /// scrive sul file log di default il valore della variabile string passata su una riga... (tab delim?!?) /// /// testo iniziale del log /// public bool scriviLog(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)); if (_doShrinkFolder) { // verifica dim directory ed eventualmente cancella... - opzionale shrinkDir(); } // (ri)genera il nome del file di log... newLogfileName(); // aggiunge in append... StreamWriter sw = new StreamWriter(_logfileName, true); bool fatto; try { sw.WriteLine(_testo); sw.Flush(); sw.Close(); fatto = true; } catch { fatto = false; } return fatto; } /// /// scrive un messaggio di log con etichetta pre /// /// testo messaggio /// tipo di log da registrare (etichetta [...]) /// public bool scriviLog(string testoLog, tipoLog tipo) { bool answ = false; answ = scriviLog(string.Format("[{0}] - {1}", tipo, testoLog)); // se è un tipo EXCEPTION allora scrivo anche log diagnostico if (tipo == tipoLog.EXCEPTION) { try { // se abilitato output diagnostica... if (memLayer.ML.CRB("enableDumpDiag")) { string[] pingTagets = SteamWare.StringSplitter.CSplitter.Split(memLayer.ML.CRS("pingTargets"), "#", true, -1, SteamWare.StringSplitter.ComparisonMethod.Text); string[] wwwTagets = SteamWare.StringSplitter.CSplitter.Split(memLayer.ML.CRS("wwwTargets"), "#", true, -1, SteamWare.StringSplitter.ComparisonMethod.Text); // chiamo scrittura diagnostica scriviDiagnostica("DUMP diagnostico causa Eccezione", pingTagets, wwwTagets); } } catch { } } return answ; } /// /// scrive su log un dump di diagnostica /// /// Causale diagnostica /// target per test PING /// target x download www page public void scriviDiagnostica(string testoLog, string[] pingTargets, string[] wwwTargets) { string txtDiag = ""; try { scriviLog(string.Format("[{0}]{1}{2}", tipoLog.DUMP_DIAGN, Environment.NewLine, SteamwareStrings.charLine('+', 80))); scriviLog(string.Format("[{0}]{1}{2}", tipoLog.DUMP_DIAGN, Environment.NewLine, SteamwareStrings.charLine('+', 80))); scriviLog(string.Format("[{0}] - {1}{2}", tipoLog.DUMP_DIAGN, testoLog, Environment.NewLine)); } catch { } try { scriviLog(string.Format("[{0}]{1}{2}", tipoLog.DUMP_DIAGN, Environment.NewLine, formDiagBlock("UPTIME", Diagnostica.uptime))); } catch { } try { scriviLog(string.Format("[{0}]{1}{2}", tipoLog.DUMP_DIAGN, Environment.NewLine, formDiagBlock("STORAGE", Diagnostica.diskUsage))); } catch { } try { scriviLog(string.Format("[{0}]{1}{2}", tipoLog.DUMP_DIAGN, Environment.NewLine, formDiagBlock("USB", Diagnostica.usbDevices))); } catch { } try { scriviLog(string.Format("[{0}]{1}{2}", tipoLog.DUMP_DIAGN, Environment.NewLine, formDiagBlock("SERIAL", Diagnostica.serialPorts))); } catch { } try { scriviLog(string.Format("[{0}]{1}{2}", tipoLog.DUMP_DIAGN, Environment.NewLine, formDiagBlock("NETWORKING (interfaces)", Diagnostica.networkInterfaces))); } catch { } try { // se richiesto faccio PING test if (pingTargets.Length > 0) { txtDiag = ""; foreach (string target in pingTargets) { txtDiag += SteamwareStrings.addLine(Diagnostica.pingIp(target)); } scriviLog(string.Format("[{0}]{1}{2}", tipoLog.DUMP_DIAGN, Environment.NewLine, formDiagBlock("NETWORKING (ping)", txtDiag))); } } catch { } try { // se richiesto faccio PING test if (wwwTargets.Length > 0) { txtDiag = ""; foreach (string target in wwwTargets) { txtDiag += SteamwareStrings.addLine(string.Format("WebPage Test ({2}): {0}{1}", Environment.NewLine, Diagnostica.getPageContent(target), target)); } scriviLog(string.Format("[{0}]{1}{2}", tipoLog.DUMP_DIAGN, Environment.NewLine, formDiagBlock("NETWORKING (www)", txtDiag))); } } catch { } // chiudo scriviLog(string.Format("[{0}]{1}{2}", tipoLog.DUMP_DIAGN, Environment.NewLine, SteamwareStrings.charLine('-', 80))); scriviLog(string.Format("[{0}]{1}{2}", tipoLog.DUMP_DIAGN, Environment.NewLine, SteamwareStrings.charLine('-', 80))); } /// /// 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; } #endregion #region metodi privati /// /// fornisce il nome del file in cui loggare (ed eventualmente crea...) /// protected void newLogfileName() { DateTime CurrentDateTime = DateTime.Now; _logfileName = _logBaseDir + String.Format("{0}.txt", CurrentDateTime.ToString("yyyyMMdd")); } /// /// provvede a verificare la dim della cartella dei log e cancella i + vecchi fino a restare a dim inferiori a _logMaxMb /// protected void shrinkDir() { // ottengo elenco files *.txt fileMover.obj.setDirectory(_logBaseDir); FileInfo[] _fis = fileMover.obj.elencoFiles_FI("*.txt"); 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 /// /// /// protected void deleteOldest(DirectoryInfo _di) { FileInfo[] _fis = _di.GetFiles(); DateTime _oldest = DateTime.Now; string _nome = ""; foreach (FileInfo _file in _fis) { if (_file.CreationTime < _oldest) { _nome = _file.Name; } } FileInfo fi = new FileInfo(_nome); fi.Delete(); } #endregion } /// /// tipo di log ammesso /// public enum tipoLog { /// /// informazioni di debug /// DEBUG, /// /// dump diagnostica /// DUMP_DIAGN, /// /// errori /// ERROR, /// /// eccezioni nell'esecuzione try/catch /// EXCEPTION, /// /// errori fatali /// FATAL, /// /// informazioni opzionali /// INFO, /// /// log dei lemmi invocati per traduzione da vocabolario /// LEMMA, /// /// fase di avvio componente /// STARTUP, /// /// avvisi /// WARNING } }