Buongiorno,
Ho implementato un semplice logger che utilizzo per scrivere su file di testo i normali log e le eccezioni. Di seguito il codice
public static void FileText(Exception ex)
{
FileText(ex, "");
}
public static void FileText(string st)
{
FileText(null, st);
}
public static void FileText(Exception ex, String st)
{
try
{
string serverPath = System.Web.HttpContext.Current.Server.MapPath("~/logs");
if (!Directory.Exists(serverPath))
System.IO.Directory.CreateDirectory(serverPath);
string fileName = Path.Combine(serverPath, String.Format("Error-{0}.txt", DateTime.Now.Date.ToShortDateString().Replace('/', '_')));
if (!File.Exists(fileName))
File.Create(fileName).Dispose();
lock (DebugWriter)
{
using (StreamWriter writer = new StreamWriter(fileName, true))
{
if (ex != null)
{
string innerException = "";
if (ex.InnerException != null)
innerException = ex.InnerException.ToString();
writer.WriteLine(DateTime.Now.ToString("yyyy-MM-dd-HH:mm:ss") + " - Message :" + ex.Message + Environment.NewLine + "StackTrace :" + ex.StackTrace + "Message : " + innerException + " S:" + st);
}
else
{
writer.WriteLine(DateTime.Now.ToString("yyyy-MM-dd-HH:mm:ss") + " - " + st);
}
}
}
}
catch
{
}
}
Ora, vorrei migliorarlo con la possibilità di loggare dati specifici per tipo di eccezione. Per esempio, nel caso di DbEntityValidationException vorrei loggare quali siano stati i campi che hanno creato il problema che sono riportati in "e.EntityValidationErrors" che è specifico del tipo di eccezione. Ho risolto il problema con una roba del genere scritta nel catch
try
{
....
}
catch (System.Data.Entity.Validation.DbEntityValidationException e)
{
string validationError = "";
foreach (var eve in e.EntityValidationErrors)
{
validationError += String.Format("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:", eve.Entry.Entity.GetType().Name, eve.Entry.State);
foreach (var ve in eve.ValidationErrors)
{
validationError += String.Format("- Property: \"{0}\", Error: \"{1}\"", ve.PropertyName, ve.ErrorMessage);
}
}
ErrorSave.FileText(e, validationError);
}
In sostanza elaboro i dati che mi servono nel catch e li passo al logger come stringa.
Vorrei spostare questo codice nel logger per non doverlo ripetere ogni volta e quindi mi servirebbe qualcosa del tipo
if(ex.InstanceOf(System.Data.Entity.Validation.DbEntityValidationException) //non esiste ex.InstanceOf, me lo sono inventato io :D
{
....
}
Come potrei fare?