1

我希望有一个全局点来处理 asp.mvc3 应用程序中的所有异常。我创建了新应用程序,使用 nuget 添加了 elmah 并实现了 ElmahCustomLogger 类。我还在 web.config elmah 部分注册了这个自定义记录器。

出于某种原因,ElmahCustomLogger::Log 方法永远不会被调用(我在那里设置了一个刹车点)

public class ElmahCustomLogger : ErrorLog 
{
    public override string Log(Error error)
    {
        throw new NotImplementedException();
    }

    public override ErrorLogEntry GetError(string id)
    {
        throw new NotImplementedException();
    }

    public override int GetErrors(int pageIndex, int pageSize, IList errorEntryList)
    {
        throw new NotImplementedException();
    }
}
4

2 回答 2

4

看起来我只需要声明特定的构造函数即可使其工作:

public class ElmahCustomLogger : Elmah.ErrorLog
{
    public ElmahCustomLogger(IDictionary config) {}
    ...
}
于 2013-03-06T19:18:31.177 回答
0

受这篇文章的启发

这是我的解决方案:

namespace CompanyName.Models.Platform.Exceptions
{
    /// <summary>
    /// Custom SQL Elmah logger with more details from the Exception.Data Collection
    /// </summary>
    public class EnhancedSqlErrorLog : SqlErrorLog
    {
        public EnhancedSqlErrorLog(IDictionary config) : base(config)
        {
            // Must define for Elmah to work
        }

        public EnhancedSqlErrorLog(string connectString) : base(connectString)
        {
            // Must define for Elmah to work
        }

        public override string Log(Error error)
        {
            // If there is data on the exception, log it
            if (error.Exception.Data != null && error.Exception.Data.Keys.Count > 0)
            {
                var sb = new StringBuilder();

                foreach (var key in error.Exception.Data.Keys)
                {
                    sb.AppendLine(key + " - " + error.Exception.Data[key]);
                }

                // Be sure to append to whatever is already there
                error.Detail += sb.ToString();
            }

            return base.Log(error);
        }
    }
}

然后在你的 web.config 点 Elmah 使用新的记录器

<errorLog type="CompanyName.Models.Platform.Exceptions.EnhancedSqlErrorLog, YourDllName" connectionString="Data Source=.;Initial Catalog=YourDatabase;Integrated Security=True;MultipleActiveResultSets=True;" />
于 2013-10-10T22:30:48.340 回答