在托管环境下记录所有未处理的异常

时间:2018-01-04 03:56:04

标签: c# asp.net error-logging unhandled-exception

我知道我正在重新发明轮子。但是,我必须这样做,因为我被指示这样做:D。 我必须记录我的asp.net网站的所有未处理的异常。我能够动态捕获所有异常,但我无法检索实际的类和方法名称。 每次我将Global_asax作为类名,将Application_Error作为方法名。以下是我的代码。

/// <summary>
/// Determines the log type and saves log to database. Use logtype 1 for exception logging 
/// and 2 for normal audit trail.
/// </summary>
/// <param name="obj">Type of object. Accepts exception or audit log string.</param>
/// <param name="logType">Type of logging. Use LogTypes.Exception for Exception  and LogTypes.Audit for Normal Logging</param>
/// <param name="fileName"></param>
/// <param name="userId">optional parameter. Accepts userid as integer</param>
/// <param name="userName">optional parameter. Accepts username as string</param>
/// <param name="memberName"></param>
[MethodImpl(MethodImplOptions.NoInlining)]
private void Log( LogTypes logType, object obj, string memberName,string fileName, int userId = 0, string userName = "")
{
    var appLog = new ApplicationLog();
    var stackFrame = new StackFrame(2,true);
    try
    {
        var isHosted = HostingEnvironment.IsHosted;
        appLog.UserId = userId;
        appLog.UserName = userName;
        appLog.InstanceName = ConfigurationSettingsHelper.InstanceName;
        appLog.LoggedOn = DateTime.UtcNow;

        if (isHosted)
        {
            appLog.ProjectName = HostingEnvironment.ApplicationHost.GetSiteName();
            appLog.FilePath = HttpContext.Current.Request.RawUrl;
        }
        else
        {
            appLog.ProjectName= Assembly.GetCallingAssembly().GetName().Name;
            appLog.FilePath = fileName;
        }

        if (logType == LogTypes.Exception)
        {
            appLog.LogType = 1;
            if (obj is Exception  ex)
            {
                var declaringType = ex.TargetSite.DeclaringType;
                if (declaringType != null)
                {
                    appLog.ClassName = declaringType.FullName;
                    appLog.MethodName = ex.TargetSite.Name;
                }
                appLog.LogDetails = ex.ToString();
                appLog.Message = ex.Message;
            }
            else
            {
                appLog.ClassName = stackFrame.GetMethod().DeclaringType.AssemblyQualifiedName;
                appLog.MethodName = memberName;
                appLog.LogDetails = obj.ToString();
                appLog.Message = "User defined custom exception";
            }
        }
        else
        {
            appLog.LogType = 2;
            appLog.ClassName = stackFrame.GetMethod().DeclaringType.AssemblyQualifiedName;
            appLog.MethodName = memberName;
            appLog.LogDetails = obj.ToString();
            appLog.Message = "User defined custom exception";
        }

    }
    catch (Exception ex)
    {
        //In case of unhandled exceptions.Try logging internal exception once.
        //If failed, pass by silently.
        try
        {
            appLog = new ApplicationLog
            {
                UserId = userId,
                UserName = userName,
                FilePath = new StackFrame(1).GetFileName(),
                Message = ex.Message,
                InstanceName = ConfigurationSettingsHelper.InstanceName,
                ProjectName = Assembly.GetCallingAssembly().GetName().Name,
                LoggedOn = DateTime.UtcNow,
                LogType = 1,
                LogDetails = ex.ToString()
            };
            if (ex.TargetSite.DeclaringType != null)
                appLog.ClassName = ex.TargetSite.DeclaringType.FullName;
            appLog.MethodName = ex.TargetSite.Name;
        }
        finally
        {
            HttpWebMethods.PostAsync(ConfigurationSettingsHelper.LoggerApiBaseAddress,
                ConfigurationSettingsHelper.SaveLogEndpoint, appLog);
        } // intentionally eating exception}
    }
    finally
    {
        HttpWebMethods.PostAsync(ConfigurationSettingsHelper.LoggerApiBaseAddress,
            ConfigurationSettingsHelper.SaveLogEndpoint, appLog);
    }
}

它在所有地方都很好。但是对于任何未处理的异常,我需要捕获类名和方法名。但相反,它给了我global.asax细节。

它是一个类库,我希望它像Global.asax一样工作。自动识别所有错误。

请帮忙。

0 个答案:

没有答案