質問
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”が表示されないようです。キーと値の情報、例外文字列のみ。
解決
いいえ、現在の1.xリリースでは追加情報を表示できません。
他のヒント
私の解決策は、そのような情報をサーバー変数コレクションに追加することでした。
var context = HttpContext.Current;
context.Request.ServerVariables["ERROR_CALLING_WEBSERVICE_URI"] = uri;
Elmah.ErrorLog.GetDefault(context).Log(new Error(e, context))
はい、これはハックだと思います。
少量の追加データについては、@ Romaが示唆するようにエラーをカプセル化することを検討してください
ただし、この方法は、「カプセル化されたエラーメッセージ」に入れるには情報が多すぎる場合に特に便利です
簡単に回避するには、エラーをカプセル化します。外部エラーにはカスタムメッセージが含まれます。
string msg = "my custom error message";
ErrorSignal.FromCurrentContext().Raise(
new Elmah.ApplicationException(msg,ex));
わかりましたので、私はこれがあまりにも長い間含まれるのを待っていました、そしてそれの独自のフォークを作り、機能を自分で含めることにしました。
ここで見つけることができます: https://github.com/boena/elmah- with-custom-data
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
);
}
}
まあ、これに取り組んで一日を過ごしたので、私は自分の解決策を共有すると思った。上記の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の最後の1つのステップで、すでにログに記録されているエラーをすべて削除します。
public void ErrorLog_Filtering(object sender, ExceptionFilterEventArgs e)
{
if (e.Exception.Data.Contains("Logged"))
{
if (e.Exception.Data["Logged"].Equals(true)) e.Dismiss();
}
}
これはオープンソースなので、プロジェクトを取得して、目的に合わせてElmahをカスタマイズできます。
http://code.google.com/p/elmah/
MSSQLを使用している場合
-
SqlErrorLog.csをご覧ください
-
独自のデータベースを生成するSQLServer.sql
同じことをしていますが、ランダムに生成された「エラーコード」を追加する必要があります。列と例外データを使用して、通常は非常に大きなxmlフィールドにあるすべてのカスタム、セッション、フォーム、Cookie情報を追跡します。これをJSONに変更するかもしれませんが、まだわかりません。