Winston: استخدام مرتفع لوحدة المعالجة المركزية عند تمكين "prettyPrint"

تم إنشاؤها على ٤ سبتمبر ٢٠١٨  ·  3تعليقات  ·  مصدر: winstonjs/winston

من فضلك أخبرنا عن بيئتك:

ما المشكلة؟

عند إجراء تسجيل مكثف باستخدام تراكيب JSON متعددة وتمكين خيار سيؤدي Winston إلى زيادة وحدة المعالجة المركزية إلى 90٪ +

استخدام النقل المكوّن التالي لإعادة إنشاء المشكلة:

new (winston.transports.Console)({
          level: 'silly',
          silent: false,
          colorize: true,
          prettyPrint: true,
          timestamp: true,
          humanReadableUnhandledException: true,
          format: format.combine(
            format.splat(),
            format.colorize(),
            format.label({ label: 'Foo' }),
            format.timestamp(),
            format.prettyPrint(),
            format.printf( log => {
              return '[ ' + log.timestamp + ' ][ ' + log.level + ' ][ ' + log.label + ' ] ' + log.message;
            })
          )
        })

يمكن أن تكون مرتبطة بـ https://github.com/winstonjs/winston/issues/613

ماذا تتوقع أن يحدث بدلا من ذلك؟

لا يوجد ارتفاع كبير في وحدة المعالجة المركزية باستخدام Winston و prettyPrint ممكَّن

معلومات أخرى

من خلال تعطيل prettyPrint أو استخدام إصدارات مُسلَّمة من هياكل JSON قبل التسجيل ، تختفي ارتفاعات وحدة المعالجة المركزية تمامًا.

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

new (winston.transports.Console)({
          level: 'silly',
          silent: false,
          colorize: true,
          prettyPrint: false, // Forced disabled pretty print
          timestamp: true,
          humanReadableUnhandledException: true,
          format: format.combine(
            format.splat(),
            format.colorize(),
            format.label({ label: 'Foo' }),
            format.timestamp(),
            //format.prettyPrint(), // Removed prettyPrint from format
            format.printf( log => {
              return '[ ' + log.timestamp + ' ][ ' + log.level + ' ][ ' + log.label + ' ] ' + log.message;
            })
          )
        })
docs

التعليق الأكثر فائدة

سأترك هذا مفتوحًا لأنه يجب علينا إضافة بعض المستندات إلى winston أو logform.

من مستندات Node.js على util.inspect (https://nodejs.org/api/util.html#util_util_inspect_object_options):

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

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

شكرًا على طرح هذا الموضوع ، أعتقد أنه ملاحظة مهمة!

ال 3 كومينتر

ما مدى عمق / تعقيد كائنات JSON الخاصة بك؟ use.inspect ، وهو ما نستخدمه للطباعة الجميلة ، يمكن أن يصبح بطيئًا جدًا بالنسبة للأشياء المعقدة بدرجة كافية (ربما حتى حلقة لا نهائية إذا كانت هناك هياكل دورية). هل تحتاج إلى تسجيل الكائن بالكامل ، أم أنك ستكون سعيدًا بالطبقات القليلة الأولى منه (معلمة العمق)؟

في الوقت الحالي ، تعد هياكل JSON التي أقوم بتسجيلها في الأساس مجموعة من الكائنات ؛ الكائنات عبارة عن فئات تم تثبيتها ، وعددها يتراوح من 10 إلى 100 عنصر ولا يصل تعقيدها أبدًا إلى مستوى عمق 3 (لا توجد هياكل دورية).

ومع ذلك ، أقوم بتسجيلها كثيرًا: الوصول إلى الحد الأقصى للتردد وهو سجل واحد لكل 200/500 مللي ثانية.

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

لم أكن أعرف أن "util.inspect" يمكن أن يكون بطيئًا جدًا مقارنة بـ JSON.stringify ؛ من المحتمل أن تكون معلمة العمق كافية لإزالة الارتفاع (يمكنني اختباره في وقت فراغي إذا كنت بحاجة إلى مزيد من البيانات لفهم الموقف بشكل أفضل)

سأترك هذا مفتوحًا لأنه يجب علينا إضافة بعض المستندات إلى winston أو logform.

من مستندات Node.js على util.inspect (https://nodejs.org/api/util.html#util_util_inspect_object_options):

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

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

شكرًا على طرح هذا الموضوع ، أعتقد أنه ملاحظة مهمة!

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات