ما مقدار المعلومات التي يجب تسجيلها من الأخطاء؟ [مغلق

StackOverflow https://stackoverflow.com/questions/411312

  •  03-07-2019
  •  | 
  •  

سؤال

في الشركة التي أعمل من أجلها ، قمت بإنشاء فئة تسجيل أخطاء للتعامل مع الأخطاء في تطبيق ASP.NET الخاص بي. إنها فئة مخصصة لأنه لا يُسمح لنا بتثبيت برامج إضافية على خوادمنا (NLOG ، Log4Net ، إلخ).

أستخدمه حاليًا في اثنين من مشاريعي ورأيت بعض النتائج الجيدة منه. الآن أنا محاصرة الأخطاء التي تسبب أخطاء الصفحة والتطبيق. يرسل ويخزن رسالة الخطأ وجميع الاستثناءات الداخلية.

المشكلة التي أواجهها الآن هي أنني أتلقى أخطاء أنني لست متأكدًا تمامًا من كيفية إعادة إنتاجها. لم أسمع أي تقارير خطأ من أي من مستخدمي. لست متأكدًا مما يفعلونه ، أو حتى إذا كانوا يرون هذه الأخطاء.

أفكر في إنشاء سجل حدث في كل صفحة ، أو تلك التي أريد معلومات إضافية عنها. الاحتفاظ بها كمتغير جلسة على الصفحة ، وكتابة الأحداث إليها (بدء/نهاية الوظائف ، والتغييرات المتغيرة ، إلخ). ثم فقط إذا تم استدعاء خطأ لإرساله مع رسالة الخطأ لمعرفة ما إذا كانت تعطي صورة أفضل لما يجري. آمل ألا يمنحني القيام بذلك بهذه الطريقة الكثير من سجلات الأحداث عندما يصل جميع المستخدمين إلى التطبيق ، فقط يريد أن يحدث مباشرة قبل حدوث الخطأ مع المستخدم الواحد.

هل تعرف أي عيوب يجب أن أتراقبها بالطريقة؟

هل لديك أي نصيحة للأشياء التي يجب البحث عنها؟

تحديث:

saret: لقد فهمت ناد من أين أتيت مع هذا الرد وأوافق. أنا جديد إلى حد ما على هذه الشركة وما زلت بحاجة إلى تعلم كيفية قيامهم بالأشياء. في الماضي ، أجريت محادثات مع زملائي في العمل كيف سيكون من الرائع الحصول على هذا المنتج ، أو استخدام هذا المشروع مفتوح المصدر. تكمن المشكلة في ذلك ، نحن نعمل على أنظمة آمنة والحصول على الموافقة على الحصول على هذه الأشياء يستغرق الكثير من الوقت والغطاء العلوي والتعامل مع جميع الشريط الأحمر. سأبحث في الموقف أكثر لأنني أعتقد أن وجود نظام تسجيل خطأ جيد في مكانه أمر مهم ، ولا يتم استخدام أي شيء حاليًا.

Jim Blizard: أردت أن أحاول الابتعاد عن تسجيل/تخزين كل شيء في مكان ما للعودة ومعرفة ما هو الموقف الذي تسبب في الخطأ. لم أكن أرغب في الوقوع في الحمل الزائد من المعلومات التي يتم الحديث عنها في الفنان الذي ربطه روبرتو باروس. طريقة التفكير الحالية هي الحفاظ على سلسلة في الذاكرة في كل صفحة ، وإذا تم تجهيز خطأ ، في حدث Pages Page_err ، احصل على هذه السلسلة وإرفاقها بالاستثناء الذي يتم تسجيله. وبهذه الطريقة ، أقوم فقط بتسجيل الخطأ/الاستثناءات التي حدثت وتخزين سجل الحدث بهذا الخطأ. إذا لم يحدث شيء ، يتم إسقاط هذا السجل الذي تم إنشاؤه في دلو بتات لا يمكن رؤيته مرة أخرى.

Roberto Barros: شكرًا على هذا الرابط ، أتذكر قراءته في مكان ما ولكن نسيت حفظه.

هل كانت مفيدة؟

المحلول

قد لا تكون هذه هي الإجابة الدقيقة التي تبحث عنها ، ولكن لماذا تطوير آلية تسجيل الأخطاء الخاصة بك عندما تكون هناك أدوات قوية (التي تذكرها) تتعامل مع كل هذه المشكلات الرئيسية بالنسبة لك؟

يمكنني أن أقدر أنك لا يُسمح لك بتثبيت برامج إضافية ولكن لا تقوم بتسجيل مكتبات فقط فئات مثل الرمز المخصص الخاص بك؟ أين الاختلاف الأساسي؟ أعتقد أن الوقت الذي تقضيه في القلق بشأن تنفيذ إطار تسجيل قد يكون من الأفضل أن يقضي في الدفاع عن حدوث حل في تسجيل لائق.

نصائح أخرى

لقد عملت ذات مرة في وكالة لا تسمح بتركيب أي شيء لم يكن بحت رمز خاص بي أو كائنات COM (المروعة). إذا كان لديك هذا النوع من القيود ، فقم بإجراء ما إذا كان يمكنك الحصول على المصدر لـ Log4Net وتضمينه في مشروعك.

لا يوجد شيء أفضل من Log4Net حاليًا عندما يتعلق الأمر بالتسجيل.

أنا شخصياً اتبعت النهج التالي في تسجيل erros (وأخطاء السجل فقط) في تطبيق ASP.NET:

  • استعمال protected void Application_Error(object sender, EventArgs e) { Server.Transfer("~/Support/ServerErrorSupport.aspx", true); } (أنا أقوم ب Server.Transfer للحفاظ على جميع البيانات النشر.)

  • قم بإنشاء معرف خطأ فريد لهذا الخطأ (لذلك يمكن تجميع عمليات إعادة التمييز اللاحقة لنفس الخطأ). المعرف هو تجزئة محسوبة من سلسلة متسلسلة تتكون من: الملف ، الطريقة ، الكتان والخطأ. أحصل على الملف والطريقة وقيم الكتان من خلال regex على stacktrace.

  • أقوم بتسجيل جميع البيانات التالية إلى بنية XML (اعتمادًا على نوع البيانات ، أقوم بتخزين القيمة بشكل مختلف ، أنواع القيمة => toString () ، iserializable => Serialize ، ...):

    1. machinename: application.server.machinename
    2. PhysicalRoot: Application.Server.mappath ("~/")
    3. requesturl: application.request.url.tostring ()
    4. Applicationsettings: WebConfigurationManager.Appsettings
    5. ConnectionStings: WebConfigurationManager.ConnectionStrings
    6. QueryString: application.request.querystring
    7. formpost: application.request.form
    8. الجلسة: Application.Session
    9. httpheaders: application.request.headers
  • احفظ بنية XML كملف محلي يحتوي على معرف الخطأ وجدول زمني. اخترت هذا النهج لأن:

    • يمكنني إرسال علاقة بالبريد (ملف XML) إلى نفسي (أثناء الاختبار/التصحيح السهل جدًا)
    • قم بتخزينه محليًا أو في قاعدة بيانات أثناء الإنتاج
    • نظرًا لأن الملف هو مجرد (تفريغ إلى HD) لا يمكن أن يخطئ الكثير أثناء إنشاء تقرير الخطأ (مثل اتصال الخادم ، ومشكلات ديسيبل ، إلخ) ، فقط تأكد من أن لديك أذونات الكتابة.
    • بالإضافة إلى ذلك على صفحة servererRorsupport.aspx ، بعد حفظ ملف XML ، يحصل المستخدم على خيار تضمين معلومات إضافية وإضافة EmailAddress للحفاظ على تحديثه على التقدم فيما يتعلق بالخشب. يتم إلحاق هذا بمستند XML.
    • يمكنني استخدام ملف XSLT لتنسيق بيانات الخطأ (XML) في تقرير خطأ لطيف.

بالنسبة للأخطاء ، أنا معجب كبير بتسجيل الكثير. عندما تسير الأمور على ما يرام ، تكون المعلومات ذات قيمة كبيرة. أود الاحتفاظ بالسجل بالكامل في مكان واحد (ملف نصي أو جدول قاعدة بيانات) مع معرف جلسة لتجميع الأحداث ذات الصلة معًا.

هذا ما أحب تسجيله:

  • مستوى الخطأ/التصحيح (المعلومات ، التصحيح ، المشكلة ، تحطم ، إلخ ...)
  • زمن
  • نص وصفي (عادة سطر واحد)
  • تتبع المكدس (إن أمكن)
  • البيانات (المستخدم ، الجلسة ، القيم المتغيرة ، إلخ ...)

أبسط طريقة هي الكتابة إلى ملف نصي ، ولكن قد يكون من الجيد الحصول عليه في قاعدة بيانات. يمكنك أيضًا استخدام سجل أحداث Windows. بعض الأشياء التي يجب الانتباه إليها. حسنًا ... ستحتاج إلى مسح سجلاتك بشكل دوري.

قصة مضحكة: في إحدى المرات ، كان لدينا مسجل أخطاء قام بتسجيل الدخول إلى قاعدة البيانات ، ولكن كان لدينا بيانات اعتماد قاعدة بيانات سيئة تسببت في خطأ تم تسجيله بعد ذلك ... انتهى به الأمر إلى الحصول على تجاوزات مكدس من العودية (IIRC).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top