using GreenTree.Nachtragsmanagement.Core; using GreenTree.Nachtragsmanagement.Core.Domain.Logging; using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace GreenTree.Nachtragsmanagement.Services.Logging { public static class LoggingExtensions { public static void Debug(this ILogger logger, string message, Exception exception = null, Core.Domain.User.User user = null) { FilteredLog(logger, LogLevel.Debug, message, exception, user); } public static void Information(this ILogger logger, string message, Exception exception = null, Core.Domain.User.User user = null) { FilteredLog(logger, LogLevel.Information, message, exception, user); } public static void Warning(this ILogger logger, string message, Exception exception = null, Core.Domain.User.User user = null) { FilteredLog(logger, LogLevel.Warning, message, exception, user); } public static void Error(this ILogger logger, string message, Exception exception = null, Core.Domain.User.User user = null) { FilteredLog(logger, LogLevel.Error, message, exception, user); } public static void Fatal(this ILogger logger, string message, Exception exception = null, Core.Domain.User.User user = null) { FilteredLog(logger, LogLevel.Fatal, message, exception, user); } private static void FilteredLog(ILogger logger, LogLevel level, string message, Exception exception = null, Core.Domain.User.User user = null) { //don't log thread abort exception if (exception is System.Threading.ThreadAbortException) return; if (logger.IsEnabled(level)) { var fullMessage = exception == null ? string.Empty : exception.ToString(); logger.InsertLog(level, message, null, fullMessage, user); } } public static void Entity(this ILogger logger, BaseEntity entity, LogEntityActivity activity, Core.Domain.User.User user = null) { if (entity == null) return; var header = String.Empty; var body = String.Empty; switch (activity) { case LogEntityActivity.Insert: header = String.Format("Entität \"{0}\" wurde hinzugefügt", entity.GetType().Name); break; case LogEntityActivity.Update: header = String.Format("Entität \"{0}\" mit der ID \"{1}\" wurde geändert", entity.GetType().Name, entity.Id); break; case LogEntityActivity.Delete: header = String.Format("Entität \"{0}\" mit der ID \"{1}\" wurde gelöscht", entity.GetType().Name, entity.Id); break; } if (activity == LogEntityActivity.Delete) logger.InsertLog(LogLevel.Information, header, entity, String.Empty, user); else { var properties = entity.GetType().GetProperties(System.Reflection.BindingFlags.GetProperty); foreach (var property in properties) { if (!property.PropertyType.Namespace.StartsWith("System")) continue; if (typeof(IEnumerable).IsAssignableFrom(property.PropertyType) && property.PropertyType != typeof(string)) { var collection = property.GetValue(entity, null) as IEnumerable; body += String.Format("\t{0} = {1}\n", property.Name, String.Join(", ", collection)); } else body += String.Format("\t{0} = {1}\n", property.Name, property.GetValue(entity)); } var fullMessage = String.Format("{0}:\n{1}", header, body); logger.InsertLog(LogLevel.Information, header, entity, String.Empty, user); } } } }