/// <summary>
        ///   Notify Admins of logging summary
        /// </summary>
        public void NotifyAdmins()
        {
            const string subjectlineDateFormat = "dd/MM/yyyy HH:mm";

            var log4NetPath = ConfigurationManager.AppSettings.Get("BaseLog4NetUrl");

            this.ToAddress = ConfigurationManager.AppSettings.Get("ErrorReporting.ToAddress");
            this.ToName = ConfigurationManager.AppSettings.Get("ErrorReporting.ToName");
            this.FromAddress = ConfigurationManager.AppSettings.Get("ErrorReporting.FromAddress");
            this.FromName = ConfigurationManager.AppSettings.Get("ErrorReporting.FromName");

            this.SubjectLine = string.Format(
                "Log Summary for period {0} - {1}",
                this.StartDate.ToString(subjectlineDateFormat),
                this.EndDate.ToString(subjectlineDateFormat));

            var summaryText = new StringBuilder();

            using (var db = new LogDbContext())
            {

                var logSummary = db.Logs.GetLogSummary(this.StartDate, this.EndDate);

                var totalFatal = 0;
                var totalError = 0;

                foreach (var summary in logSummary)
                {
                    summaryText.AppendLine(summary.Category);
                    summaryText.AppendLine();

                    summaryText.AppendLine();
                    summaryText.Append("Fatal: ");
                    summaryText.Append(summary.Fatal.ToString(CultureInfo.InvariantCulture));
                    summaryText.Append(" (" + log4NetPath + "?filter=" + summary.Category + "&levelfilter=" + "FATAL )");
                    summaryText.AppendLine();

                    summaryText.Append("Errors: ");
                    summaryText.Append(summary.Error.ToString(CultureInfo.InvariantCulture));
                    summaryText.Append(" (" + log4NetPath + "?filter=" + summary.Category + "&levelfilter=" + "ERROR )");
                    summaryText.AppendLine();
                    summaryText.AppendLine();

                    totalFatal += summary.Fatal;
                    totalError += summary.Error;
                }

                var summaryHeader = new StringBuilder();

                summaryHeader.AppendFormat("{0} Fatal, and {1} Errors received during this period.", totalFatal, totalError);
                summaryHeader.AppendLine();

                this.BodyText = summaryHeader.ToString() + "\n" + summaryText.ToString() + log4NetPath;

                if (totalFatal + totalError > 0)
                {
                    this.Send();
                }
            }
        }
        public ActionResult GetReport(GridSettings gridSettings)
        {
            using (var db = new LogDbContext())
            {
            // create json data
            int pageIndex = gridSettings.PageIndex;
            int pageSize = gridSettings.PageSize;
            int totalRecords = db.Logs.Count();
            var totalPages = (int) Math.Ceiling(totalRecords/(float) pageSize);

            var startRow = (pageIndex - 1) * pageSize;
            var endRow = startRow + pageSize;

                if (String.IsNullOrEmpty(gridSettings.SortColumn))
                {
                    gridSettings.SortColumn = "Date";
                }

            var jsonData = new
                {
                    total = totalPages,
                    page = pageIndex,
                    records = totalRecords,
                    rows = db.Logs.OrderByField(gridSettings.SortColumn, gridSettings.SortOrder == "asc").Skip(startRow).Take(gridSettings.PageSize).ToArray()
                };

            return Json(jsonData, JsonRequestBehavior.AllowGet);
            }
        }
        //
        // GET: /Logging/Report/
        public ActionResult Index()
        {
            IEnumerable<LogSummary> summary;
            IEnumerable<Log> logs;

            using (var db = new LogDbContext())
            {
                summary = db.Logs.GetLogSummary(7).ToList();
                logs = db.Logs.GetPage(1, 20).ToList();
            }

            return View(new ReportViewModel
                {
                    LogSummary = summary,
                    Logs = logs
                });
        }
        protected override void Append(LoggingEvent loggingEvent)
        {
            try
            {
                using (var db = new LogDbContext())
                {
                    db.Logs.Add(
                        new Log
                            {
                                Id = Guid.NewGuid(),
                                UserName = loggingEvent.UserName,
                                Date = DateTime.UtcNow,
                                Level = loggingEvent.Level.ToString(),
                                Message = loggingEvent.RenderedMessage,
                                Thread = loggingEvent.ThreadName,
                                Exception = loggingEvent.GetExceptionString(),
                                Logger = loggingEvent.LoggerName,
                                Custom = string.Empty,
                                Category = loggingEvent.LoggerName
                            });

                    db.SaveChanges();
                }
            }
            catch (Exception e)
            {
                try
                {
                    Trace.Write("Error writing log to database {0}", e.Message);
                    EventLog.WriteEntry("Logging", "Error writing log to database", EventLogEntryType.Error);
                }
                catch (Exception)
                {
                    // Ignore error
                }
            }
        }