مما يجعل أداء بسيط التعديلات بالفعل جمعت الجرة ؟

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

  •  05-07-2019
  •  | 
  •  

سؤال

مثل العديد من log4j المستخدمين, نحن غالبا ما يكون مستوى التصحيح تسجيل هذا هو تكلفة تقييم.لذلك نحن الحرس تلك الحالات مع رمز مثل:

if( _logger.isDebugEnabled )
  _logger.debug("Interesting, my foojes are goofed up: " + getFullDetails())

بيد أن ذلك أقبح من عادي _logger.تصحيح الدعوة ، وأحيانا مبرمج لا يدرك التقييم يمكن أن تكون مكلفة.

يبدو أنه ينبغي أن تكون بسيطة إلى حد ما إلى كتابة برنامج يأخذ جمع جرة الحراس كل _logger.تصحيح المكالمات مع isDebugEnabled الاختيار.ونحن من المرجح أن تكون على استعداد لقبول الحمل الزائد من التحقق isDebugEnabled في جميع الحالات.

وقد حاول أي شخص هذا النهج ، أو فعل مماثلة بعد تجهيز وعاء ؟

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

المحلول

هل نظرت في AspectJ ؟ وهذا يدعم الجوانب باستخدام بايت كود النسيج، ويمكن أن اعتراض في ملف بامتداد جمعت سابقا .

نصائح أخرى

وبدلا من النظر إلى تعديل جرة، ويهمني ان البحث عن حل باستخدام <لأ href = "http://www.google.com/search؟q=java+bytecode+instrumentation" يختلط = "نوفولو noreferrer" > بايت كود الأجهزة . المشكلة ستكون لتحديد تلك الأجزاء من التعليمات البرمجية التي تريد التفاف داخل .isDebugEnabled() - سيكون لديك لتحديد الكائنات التي يتم استخدامها فقط من أجل الدعاء log4j

أعتقد لن يكون حلا جيدا أن رمز لن تكون فعالة كما هو.

نعتبر أن log4j هو مستنكر.الكاتب نفسه ترك الأمر كما هو ، لتجنب كسر التوافق ، لكنه خلق جديد ، SLF4J (http://www.slf4j.org/ ).وهو يوفر واجهة و التنفيذ ، وفقا التمييز العموم-تسجيل/log4j ، ولكن من دون عيوب كل...

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


لدينا قانون لا تستخدم slf4j ، ولكن لدينا أداة الأساليب التي تفعل ذلك بالضبط.يتم ترميز تقريبا على النحو التالي (من الذاكرة):

    public enum LogLevel {
       FATAL, ERROR, WARNING, INFO, DEBUG;

       public void log(Logger logger, String format, Object... parameters) {
         if (isEnabled(logger)) {
            logImpl(logger, String.format(format, parameters));
         }
       }
       public boolean isEnabled(Logger logger) {
         switch(this) {
           case WARNING : return logger.isWarningEnabled();
           case INFO : return logger.isInfoEnabled();
           case DEBUG : return logger.isDebugEnabled();
           default: return true;
         }
       }
       private void logImpl(Logger logger, String message) {
         switch(this) {
           case WARNING : logger.warn(message);
           // other cases
         }
       }
    }

وهو يستخدم:

     public void myMethod(Object param) {
       LogLevel.WARNING.log(LOGGER, "What is my message ....", "myMethod", param);
     }

التحديث :إذا كنت بحاجة إلى استدعاء أسلوب في السجل...

  • أحد الاحتمالات هو أن استخدام toString الأسلوب.هذا هو المناسب إذا كان التسجيل 'التقنية', ، وسيتم استخدامها أيضا عند التصحيح.

  • إذا كان لديك تسجيل أكثر وظيفية (لا تستهدف developper), أقترح تحديد واجهة (فمن وظيفيا الصوت في هذه الحالة ، لذا فمن المفيد أن نقدم المعنى) :

    public interface Detailable { // the name could also suggest logging?
      String getFullDetails();
    }
    

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

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