使用ELMAH(非常棒)时,可以查看已添加到异常中的额外信息。
E.g。
Exception ex = new Exception("New exception to use ErrorSignal functionality");
ex.Data.Add("ExtraInfo", "Here is some extra information i would like to be displayed.");
ErrorSignal.FromCurrentContext().Raise(ex);
当我从elmah.axd查看异常时,它似乎没有显示“ExtraInfo”键和值信息,只是异常字符串。
答案 0 :(得分:20)
我的解决方案是将信息添加到Server Variables集合中。
var context = HttpContext.Current;
context.Request.ServerVariables["ERROR_CALLING_WEBSERVICE_URI"] = uri;
Elmah.ErrorLog.GetDefault(context).Log(new Error(e, context))
是的,我认为这是一个黑客
对于少量额外数据,请考虑按@Roma
建议的方式封装错误
但是,如果您有太多信息要放入“封装错误消息”
答案 1 :(得分:7)
简单的方法是封装错误。外部错误将包含自定义消息。
string msg = "my custom error message";
ErrorSignal.FromCurrentContext().Raise(
new Elmah.ApplicationException(msg,ex));
答案 2 :(得分:2)
不,无法使用当前的1.x版本查看额外信息。
答案 3 :(得分:2)
好的,所以我一直在等待这个包含太长时间了,并决定自己做一个自己的分叉并自己包含这个功能。
答案 4 :(得分:2)
Elmah使用ToString()方法获取异常详细信息。只需覆盖自定义异常ToString()方法,这样就可以了:
我的异常类:
public class MyCustomException : Exception
{
public string CustomProperty { get; set; }
public MyCustomException(string message, string customProperty): base(message)
{
this.CustomProperty = customProperty;
}
public override string ToString()
{
var result = base.ToString();
var propertyData = String.Format("CustomProperty: {0}", this.CustomProperty);
return result.Insert(
result.IndexOf(Environment.NewLine),
Environment.NewLine + propertyData
);
}
}
答案 5 :(得分:1)
好吧,我花了一天时间研究这个问题,我想我会分享我的解决方案。与上面的Myster解决方案非常相似,不同之处在于我修改了elmah使用的错误对象而不是请求服务器变量,如下所示:
public static void LogError(Exception e, IDictionary<string, string> customFields = null)
{
var logger = ErrorLog.GetDefault(HttpContext.Current);
customFields = customFields ?? new Dictionary<string, string>();
// Used to tell elmah not to log this twice (See global.asax)
e.Data.Add("Logged", true);
var error = new Error(e, HttpContext.Current);
customFields.ForEach(pair => error.ServerVariables.Add(pair.Key, pair.Value));
logger.Log(error);
}
然后,根据您的应用程序调用logger.LogError:
mvc添加自定义错误过滤器(http://maheshde.blogspot.ca/2012/09/error-handing-with-mvc-using-custom.html)
webforms覆盖global.asax
中的Application_Error然后,只是global.asax中的最后一步,解除已经记录的任何错误:
public void ErrorLog_Filtering(object sender, ExceptionFilterEventArgs e)
{
if (e.Exception.Data.Contains("Logged"))
{
if (e.Exception.Data["Logged"].Equals(true)) e.Dismiss();
}
}
答案 6 :(得分:-1)
由于它是开源的,您可以抓住项目并根据自己的目的自定义Elmah:
http://code.google.com/p/elmah/
如果您使用的是MSSQL
看一下SqlErrorLog.cs
SQLServer.sql生成自己的数据库
我也是这样做的,但我需要添加一个额外的随机生成的“错误代码”列,我将使用异常数据来跟踪通常在其中的所有自定义,会话,表单,cookie信息超级大xml字段。我可能会将此更改为JSON,尚不确定。