質問

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()メソッドをオーバーライドするだけで、このように動作します:

elmahのサンプル例外

私の例外クラス:

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に変更するかもしれませんが、まだわかりません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top