Winston: طريقة تسجيل الخطأ لا تسجل مثيل الخطأ بشكل صحيح

تم إنشاؤها على ٩ أكتوبر ٢٠١٨  ·  29تعليقات  ·  مصدر: winstonjs/winston

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

  • _ winston إصدار؟ _ 3.1.0

    • [] winston@2

    • [x] winston@3

  • النواتج _ node -v _ v8.11.3

  • _نظام التشغيل _ Linux

  • _اللغة؟ _ الكل

ما المشكلة؟

logger.error يُستدعى مع Error مثيل لا يستخدم message و stack ، بدلاً من ذلك اختبار السجلات error .

مثال على الكود:

const winston = require('winston');

const alignedWithColorsAndTime = winston.format.combine(
  // winston.format.colorize({ all: true }),
  // winston.format.timestamp(),
  // winston.format.align(),
  winston.format.printf((info) => {
    const { level, message, ...args } = info;

    if (level.indexOf('error') !== -1) {
      console.log(typeof message, JSON.stringify(message));
    }

    return `[${level}]: ${message} ${Object.keys(args).length ? JSON.stringify(args, null, 2) : ''}`;
  })
);

const transports = [new winston.transports.Console({
  level: 'debug',
  format: alignedWithColorsAndTime
})];

const logger = winston.createLogger({
  level: 'debug',
  transports
});

try {
  logger.info('aaaaa');
  logger.debug('bbbb');
  logger.error('eeee');

  throw new Error('Scary error');
} catch (error) {
  logger.error(error);
}

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

تم تسجيل رسالة خطأ فعلية على الأقل. من الناحية المثالية - مع المكدس.

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

لذلك ، اتضح أنني كنت مخطئًا بشأن منسق الخطأ. إنه ليس في Winston بعد ، ولكنه موجود في [email protected] ، وعليك استخدامه مع المنسقين metadata و json .

لذا ، نعم ، هناك الكثير من المحاذير لبدء العمل. سيكون من الأفضل لو كان بإمكانك استخدامه بمفرده ، لكنه أفضل من لا شيء.

const winston = require('winston');
const { format } = require('logform');

const logger = winston.createLogger({
  format: format.combine(
    format.errors({ stack: true }),
    format.metadata(),
    format.json(),
  ),
  transports: [ new winston.transports.Console() ],
});

logger.error(new Error(FakeError));

ال 29 كومينتر

لا يعتمد على المنسق printf ، simple واحد يعطي نفس النتيجة. حدث بدون منسق يقوم بإرجاع رسالة فارغة.

القضية ذات الصلة على الأرجح رقم 1422

واجهت نفس المشكلة ، اضطررت إلى تنفيذ logger.error بنفسي:

  logger.error = err => {
      if (err instanceof Error) {
        logger.log({ level: 'error', message: `${err.stack || err}` });
      } else {
        logger.log({ level: 'error', message: err });
      }
    };

gtsec في الواقع لقد فعلت نفس الاسم الجديد الذي استخدمته للتو .exception .

قد يكون هذا بسبب wintson-transport ، راجع https://github.com/winstonjs/winston-transport/issues/31 للمشكلة و https://github.com/winstonjs/winston-transport/pull/ 34 للعلاقات العامة.

في نموذج الريبو حيث أختبر ترحيل winston-graylog2 لاستخدام winston@3x انتهى بي الأمر بتنفيذ تحويل الخطأ كمنسق مخصص.

const errorFormatter = format((info, opts) => {
  let formatted = {};

  if (info instanceof Error) {
    // An error object is not 100% like a normal object, so
    // we have to jump through hoops to get needed info out
    // of error objects for logging.
    formatted = Object.assign(formatted, info);
    formatted.message = info.stack;
  } else {
    formatted = info;
  }

  return formatted;
});

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

في الواقع ، لقد لاحظت الآن أن كائن تنسيق winston الافتراضي به معالج للأخطاء ، لذلك تحتاج فقط إلى إرفاقه كمنسق.

https://github.com/winstonjs/logform#errors

مثال؟

لذلك ، اتضح أنني كنت مخطئًا بشأن منسق الخطأ. إنه ليس في Winston بعد ، ولكنه موجود في [email protected] ، وعليك استخدامه مع المنسقين metadata و json .

لذا ، نعم ، هناك الكثير من المحاذير لبدء العمل. سيكون من الأفضل لو كان بإمكانك استخدامه بمفرده ، لكنه أفضل من لا شيء.

const winston = require('winston');
const { format } = require('logform');

const logger = winston.createLogger({
  format: format.combine(
    format.errors({ stack: true }),
    format.metadata(),
    format.json(),
  ),
  transports: [ new winston.transports.Console() ],
});

logger.error(new Error(FakeError));

الحل البديل @ jeremy-j-ackso

يقترح إغلاق هذا بسبب # 1576.

يمكن استخدام الصيغ.

const winston = require('winston');
const { format } = winston;

const logger = winston.createLogger({
  format: format.combine(
    format.errors({ stack: true }),
    format.metadata(),
    format.json(),
  ),
  transports: [ new winston.transports.Console() ],
});

logger.error(new Error('FakeError'));

نعم ، يجب أن تكون الأخطاء قابلة للتسجيل في النهاية بطريقة لطيفة للأشخاص الذين يرغبون في تشغيل هذه الوظيفة!

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

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

كمشروع ، يجسد Winston @ 3 رأيًا جديدًا: ادفع التنسيق المعقد إلى تنسيقات منفصلة ذات غرض واحد واجعل الجمع بين هذه التنسيقات أمرًا سهلاً للمستخدمين.

سأعترف أنه لا يزال هناك عمل يتعين القيام به بشأن التوثيق ، جنبًا إلى جنب مع الشروحات عالية المستوى وتصحيح التنسيقات.

كل ما قيل أن تنسيق الأخطاء المقترح يعكس رأي المشروع: هل يمكن تنفيذ ذلك كتنسيق مخصص؟

DABH لماذا أغلقت هذه القضية؟ لا يعمل استخدام المنسق الذي اقترحه @ jeremy-j-ackso بدون المنسق format.json() . إنه ليس حتى حل بديل.

const winston = require('winston');
const { format } = winston;

const logger = winston.createLogger({
  format: format.combine(
    format.errors({ stack: true }),
    format.metadata()
  ),
  transports: [ new winston.transports.Console() ],
});


function a() {
  throw new Error('Error from "a"');
  console.log('a()');
}

function b() {
  a();

  console.log('a() called from b()');
}

function c() {
  b();

  console.log('b() called from c()');
}

function f() {
  try {
    c();

    console.log('c() called from d()');
  } catch(error) {
    logger.error(error);
  }
}

f();
$ node 1.js
Error from "a"

تم الاختبار على [email protected] .

نعم ، أتفق مع nosuchip - لا يبدو أن هناك حلًا جيدًا إذا كنت تريد استخدام تنسيق simple() . نحن في الواقع بحاجة إلى كليهما للعمل في مشروع لدي. انتهى بي الأمر بإنشاء منسق مخصص يعمل ولكنه نوع من الاختراق. يعطيني هذا الرمز مكدسًا في json عند استخدام هذا التنسيق ومكدس في نص خام عند استخدام تنسيق بسيط:

const displayStack = winston.format((info) => {
  info.message = info.stack ? info.stack : info.message
  return info
})

const consoleDebugFormat = winston.format.combine(
  displayStack(),
  winston.format.simple()
)

const jsonFormat = winston.format.combine(
  winston.format.errors({ stack: true }),
  winston.format.json()
)

const activeFormat = process.env.LOG_FORMAT === 'simple' ? consoleDebugFormat : jsonFormat

const loggerConsole = new winston.transports.Console()
const logger = winston.createLogger({
  transports: [loggerConsole],
  format: activeFormat,
  exitOnError: false
})

إذن ، لا يزال هناك _لا يوجد حل لهذه المشكلة؟

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

بالنسبة إلى TypeScript ، أستخدم المقتطف التالي لتجنب كتابة التحذيرات:

... 
// standard transports and format initialization

export interface BetterLogger extends winston.Logger {
    exception: (error: Error, prefix?: string) => BetterLogger;
}

const logger: BetterLogger = winston.createLogger({
    level: config.logLevel,
    transports,
}) as BetterLogger;

// Monkey patching Winston because it incorrectly logs `Error` instances even in 2020
// Related issue: https://github.com/winstonjs/winston/issues/1498
logger.exception = function (error, prefix?) {
    const message = error.message || error.toString();
    const stack = error.stack;
    prefix = prefix ? `${prefix} ` : '';

    return this.error(`${prefix}${message}, stack ${stack}`) as BetterLogger;
};

export default logger;

إنه يعمل مع أي مُنسِّقات أخرى.

السبب: دائمًا ما تنتهي محاولة تنفيذ المنسق الحالي بالفشل حيث لم يتم تمرير info إلى المنسق أبدًا instanceof Error .

لا يمكنني تسجيل أي خطأ ذي معنى:

import winston from 'winston';
const consoleTransport = new winston.transports.Console({
    format: winston.format.combine(
        winston.format.errors({ stack: true }),
        winston.format.metadata(),
        winston.format.json(),
    )
});
export const logger = winston.createLogger({
    transports: [
        consoleTransport,
    ]
});

إنه يسجل هذا الجزء المحزن فقط:
{"level":"error","metadata":{}}

مجرد استخدام بسيط هو الأفضل تقريبًا لأنه ينتج عنه ضعف المعلومات:
error: undefined

ماذا احتاج:

TypeError: Cannot read property 'check' of undefined
    at Object.updateSession (U:\Users\muj\endpoint\src\services\cookieService.ts:88:23)

هل هناك طريقة للحصول على المعلومات التي تطبعها العقدة تلقائيًا عندما تكتشف خطأ غير معالج؟

أي تحديثات؟

لقد لاحظت أن السبب هو أن Object.assign({}, info) لا ينسخ خاصية المكدس في:

https://github.com/shrinktofit/editor-3d/blob/5afb36943c4f4fd9a145d82cd4bd44cd6b188242/app/node_modules/winston-transport/index.js#L91

لذلك في الأساس ، إذا كنت أريد تتبع المكدس ، فيجب علي إما

  1. استخدم منسق الأخطاء مع مُنسِّقات json و meta واسترجع سجل تنسيق json
  2. أو أنفذ المنسق المخصص الخاص بي لإعطائي إخراج سجل نصي بسيط
    أنا على صواب أم فاتني شيء ؟؟

إنه عام 2021 وما زال لا يعمل مع حالات الخطأ. لقد توقفت عن استخدام هذا.

هذا هو لأعلى ، وأعتقد أن هذا يجب أن يأخذ في الاعتبار.
لقد قمت بترقية winston من 2 إلى 3 ، لكنني الآن أخفض الدرجة إلى 2 بسبب هذا.
الرجاء DABH إعادة فتح هذه المشكلة
شكرا لعملك بالرغم من ذلك

هذه مشكلة بالغة الأهمية لتطبيقنا ، فنحن نستخدم Winston وعندما تحدث أخطاء لا توجد طريقة لرؤية المكدس دون تعديل .error

هذه مشكلة بالغة الأهمية لتطبيقنا ، فنحن نستخدم Winston وعندما تحدث أخطاء لا توجد طريقة لرؤية المكدس دون تعديل .error

لدي نفس المشكلة

مرحبا شباب!
لقد قمت بإصلاح ذلك بتنسيق errors .
https://github.com/winstonjs/logform/pull/118

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