internal static void SendHealthCheckEmail(string appFullName) { var message = new EmailMessage(); var body = new StringBuilder(); var tenGibibytes = 10 * Math.Pow(1024, 3); var freeSpaceIsLow = false; foreach (var driveInfo in DriveInfo.GetDrives().Where(d => d.DriveType == DriveType.Fixed)) { var bytesFree = driveInfo.TotalFreeSpace; freeSpaceIsLow = freeSpaceIsLow || bytesFree < tenGibibytes; body.AppendLine("{0} free on {1} drive.".FormatWith(FormattingMethods.GetFormattedBytes(bytesFree), driveInfo.Name)); } message.Subject = StringTools.ConcatenateWithDelimiter(" ", "Health check", freeSpaceIsLow ? "and WARNING" : "", "from " + appFullName); message.BodyHtml = body.ToString().GetTextAsEncodedHtml(); EmailStatics.SendDeveloperNotificationEmail(message); }
/// <summary> /// Reports an error to the developers. The report includes the specified exception and additional information about the running program. The prefix /// provides additional information before the standard exception and page information. /// </summary> public static void ReportError(string prefix, Exception exception) { using (var sw = new StringWriter()) { if (prefix.Length > 0) { sw.WriteLine(prefix); sw.WriteLine(); } if (exception != null) { sw.WriteLine(exception.ToString()); sw.WriteLine(); } sw.WriteLine("Application: {0}".FormatWith(ConfigurationStatics.AppName)); sw.WriteLine("Version: {0}".FormatWith(ConfigurationStatics.AppAssembly.GetName().Version)); if (!ConfigurationStatics.IsDevelopmentInstallation) { sw.WriteLine(); sw.WriteLine("Installation: {0}".FormatWith(ConfigurationStatics.InstallationConfiguration.InstallationName)); sw.WriteLine("Machine: {0}".FormatWith(Tewl.Tools.NetTools.GetLocalHostName())); } if (NetTools.IsWebApp()) { // This check ensures that there is an actual request, which is not the case during application initialization. if (EwfApp.Instance != null && EwfApp.Instance.RequestState != null) { sw.WriteLine(); sw.WriteLine("URL: " + AppRequestState.Instance.Url); sw.WriteLine(); foreach (string fieldName in HttpContext.Current.Request.Form) { sw.WriteLine("Form field " + fieldName + ": " + HttpContext.Current.Request.Form[fieldName]); } sw.WriteLine(); foreach (string cookieName in HttpContext.Current.Request.Cookies) { sw.WriteLine("Cookie " + cookieName + ": " + HttpContext.Current.Request.Cookies[cookieName].Value); } sw.WriteLine(); sw.WriteLine("User agent: " + HttpContext.Current.Request.GetUserAgent()); sw.WriteLine("Referrer: " + NetTools.ReferringUrl); User user = null; User impersonator = null; // exception-prone code try { user = AppTools.User; impersonator = AppRequestState.Instance.ImpersonatorExists ? AppRequestState.Instance.ImpersonatorUser : null; } catch {} if (user != null) { sw.WriteLine("User: {0}{1}".FormatWith(user.Email, impersonator != null ? " (impersonated by {0})".FormatWith(impersonator.Email) : "")); } } } EwlStatics.CallEveryMethod( () => { lock ( errorEmailLimiter ) { errorEmailLimiter.RequestAction( () => EmailStatics.SendDeveloperNotificationEmail(getErrorEmailMessage(sw.ToString())), () => SendDeveloperNotification( "An error occurred and the email rate-limit was reached! See the log file for this and any other errors that may occur in the near future."), () => {}); } }, () => logError(sw.ToString())); } }
/// <summary> /// Reports a fault (a problem that could later cause errors) to the developers. /// </summary> public static void ReportFault(string message) { EmailStatics.SendDeveloperNotificationEmail(getFaultEmailMessage(message)); }
/// <summary> /// Sends a notification to the developers. Do not use for anything that requires corrective action. /// </summary> public static void SendDeveloperNotification(string message) { EmailStatics.SendDeveloperNotificationEmail(getNotificationEmailMessage(message)); }
/// <summary> /// Reports an error to the developers. The report includes the specified exception and additional information about the running program. The prefix /// provides additional information before the standard exception and page information. /// </summary> public static void ReportError(string prefix, Exception exception) { using (var sw = new StringWriter()) { if (prefix.Length > 0) { sw.WriteLine(prefix); sw.WriteLine(); } if (exception != null) { sw.WriteLine(exception.ToString()); sw.WriteLine(); } if (NetTools.IsWebApp()) { // This check ensures that there is an actual request, which is not the case during application initialization. if (EwfApp.Instance != null && EwfApp.Instance.RequestState != null) { sw.WriteLine("URL: " + AppRequestState.Instance.Url); sw.WriteLine(); foreach (string fieldName in HttpContext.Current.Request.Form) { sw.WriteLine("Form field " + fieldName + ": " + HttpContext.Current.Request.Form[fieldName]); } sw.WriteLine(); foreach (string cookieName in HttpContext.Current.Request.Cookies) { sw.WriteLine("Cookie " + cookieName + ": " + HttpContext.Current.Request.Cookies[cookieName].Value); } sw.WriteLine(); sw.WriteLine("User agent: " + HttpContext.Current.Request.GetUserAgent()); sw.WriteLine("Referrer: " + NetTools.ReferringUrl); User user = null; User impersonator = null; // exception-prone code try { user = AppTools.User; impersonator = AppRequestState.Instance.ImpersonatorExists ? AppRequestState.Instance.ImpersonatorUser : null; } catch {} if (user != null) { sw.WriteLine("User: {0}{1}".FormatWith(user.Email, impersonator != null ? " (impersonated by {0})".FormatWith(impersonator.Email) : "")); } } } else { sw.WriteLine("Program: " + ConfigurationStatics.AppName); sw.WriteLine("Version: " + ConfigurationStatics.AppAssembly.GetName().Version); sw.WriteLine("Machine: " + StandardLibraryMethods.GetLocalHostName()); } StandardLibraryMethods.CallEveryMethod( delegate { EmailStatics.SendDeveloperNotificationEmail(getErrorEmailMessage(sw.ToString())); }, delegate { logError(sw.ToString()); }); } }