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.confReadString("_logDir"));
}
catch
{
_logBaseDir = memLayer.ML.confReadString("logLocalDir");
}
_logMaxMb = 100; // di default 100 mb...
try
{
_doShrinkFolder = memLayer.ML.confReadBool("doShrinkFolder");
}
catch
{
_doShrinkFolder = true;
}
}
///
/// livello di log applicazione (da web.config, chiave '_logLevel')
///
public int logLevel
{
get
{
int answ = -1;
try
{
answ = memLayer.ML.confReadInt("_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.confReadBool("enableDumpDiag"))
{
string[] pingTagets = SteamWare.StringSplitter.CSplitter.Split(memLayer.ML.confReadString("pingTargets"), "#", true, -1, SteamWare.StringSplitter.ComparisonMethod.Text);
string[] wwwTagets = SteamWare.StringSplitter.CSplitter.Split(memLayer.ML.confReadString("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
}
}