ما مدى سرعة طريقة تسجيل log4net (تصحيح، معلومات، الخ)؟

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

  •  05-07-2019
  •  | 
  •  

سؤال

وأنا معجب كبير من log4net ، لكن في الآونة الأخيرة، وبعض (في إدارتي) وشكك إدراجه في مشاريعنا بسبب ما يبدو ثقل كل طريقة تسجيل. أنا أزعم أن هناك أساليب أفضل من غيرها، ولكن هذا سؤال آخر.

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

و، وأنا على علم تقنية بسيطة لإضافة بند الحرس تصريحات تقييم طويلة على سبيل المثال:

if (log.IsDebug)
{
  log.DebugFormat(...);
}

ولذا، دعونا يستبعد أن من نظر في الوقت الراهن.

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

المحلول

وأنا لست على دراية log4net، أو log.DebugFormat (...).

ولكن تكلفة تسجيل هو حقا في مجالين.

والأول هو الدعوة قطع الأشجار، والثاني هو المستمرة الفعلي للمعلومات السجل.

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

ولكن عندما كنت لا تستخدم الحراس، فإن التكلفة قد يصبح سعر خلق الحجج تسجيل الفعلية.

وعلى سبيل المثال، في log4j، وكان هذا المصطلح الشائع:

log.debug("Runtime error. Order #" + order.getOrderNo() + " is not posted.");

وهنا، وتكلفة التقييم الفعلي للتعبير سلسلة جعل الرسالة. وذلك لأن بغض النظر عن مستوى التسجيل، هذا التعبير، والسلسلة الناتجة تم إنشاؤها. تخيل لو بدلا كان لديك شيء من هذا القبيل:

log.debug("Something wrong with this list: " + longListOfData);

وهذا يمكن أن يخلق متغير سلسلة كبيرة ومكلفة أنه إذا لم يتم تعيين مستوى سجل لDEBUG، ببساطة تضيع.

والحراس:

if (log.isDebug()) {
    log.debug(...);
}

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

في قانون بلدي، كنت قد كتبت مجمع لقطع الأشجار، وأستطيع أن إنشاء سجلات مثل هذا:

log.debug("Runtime error. Order # {0} is not posted.", order.getOrderNo());

وهذا هو حل وسط لطيفة. هذا يعتمد على جافا varargs، وقانون بلدي يتحقق مستوى التسجيل، ومن ثم تنسيقات الرسالة بشكل مناسب. هذا هو تقريبا سريع مثل الحراس، ولكن أنظف بكثير في الكتابة.

والآن، log.DebugFormat قد صنعا شيئا مماثلا، وأنني لا أعرف.

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

scroll top