Winston: لا يقوم Winston بتسجيل / تحليل خطأ تم اكتشافه من استثناء

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

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

  • _ winston إصدار؟ _ 3.2.1

    • [] winston@2

    • [x] winston@3

  • _ node -v النواتج: _ v12.8.1
  • _ نظام التشغيل؟ _ (Windows أو macOS أو Linux) Windows
  • _Language؟ _ (الكل | TypeScript XX | ES6 / 7 | ES5 | Dart) ES6

ما المشكلة؟

يبدو أن Winston لا يسجل الاستثناءات ، ولا يبدو أنه يحلل كائن الخطأ بشكل صحيح.

const logger = winston.createLogger({
    level: 'info',
    format: winston.format.combine(winston.format.timestamp(), winston.format.json()),
    transports: [
        new winston.transports.File({
            filename: `./logs/error-${momentLogger.unix()}.log`,
            level: 'error'
        }),
        new winston.transports.File({
            filename: `./logs/debug-${momentLogger.unix()}.log`,
            level: 'debug'
        }),
        new winston.transports.File({
            filename: `./logs/combined-${momentLogger.unix()}.log`
        }),
        new winston.transports.Console({
            format: winston.format.simple()
        })
    ]
});

try {
    logger.debug(folderIdRegex.exec(event.link)[1]);
} catch (ex) {
    console.log(ex); // Correctly prints
    logger.info(ex); // Undefined
    logger.debug(ex); // Undefined
    logger.error(ex); // Undefined
}

مزيد من التصحيح باستخدام مصحح VSCode

// Output
TypeError: Cannot read property '1' of null
    at .....google-sheets-scraping-testing.js:188:51
    at processTicksAndRejections (internal/process/task_queues.js:85:5)
info: undefined {"timestamp":"2020-03-04T19:58:36.251Z"}
error: undefined {"timestamp":"2020-03-04T19:58:36.251Z"}

// Here I started using the built-in debug terminal
ex // Input into debug console
> TypeError: Cannot read property '1' of null // Result of ex
logger.log(ex) // Input into debug console
info: undefined {"timestamp":"2020-03-04T20:11:13.924Z"} // Result of logger.log(ex)
> DerivedLogger {_readableState: ReadableState, readable: true, _events: Object, _eventsCount: 3, _maxListeners: undefined, …}  // Result of logger.log(ex)

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

أتوقع أن يسجل وينستون الخطأ الذي تم اكتشافه من كتلة try ... catch. إذا قمت بدلاً من ذلك بتمرير ex.message بدلاً من ex ، فسيتم إنتاجه بشكل صحيح. يتم تعريف ex جميع أنحاء كتلة الالتقاط ، ولكن لا يبدو أن Winston قادرًا على تحليلها لسبب ما.

معلومات أخرى

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

بالإضافة إلى ذلك ، أعتقد أن هذا الخطأ يستلزم أيضًا المشكلة التي واجهها مستخدم آخر في الشهر الماضي عند # 1758

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

أعتقد أن هذا قد يكون بسبب السلوك غير المتسق بين أجهزة تسجيل بيانات Winston وعمليات النقل عند تطبيق التنسيقات. في winston-transport ، يقوم جزء من وظيفة TransportStream _write بما يلي:

transformed = this.format.transform(Object.assign({}, info), this.format.options);

يبدو أن الكود ذي الصلة في winston / logger.js يفعل هذا:

this.push(this.format.transform(info, this.format.options));

إليك وصف مبسط للمشكلة.

const winston = require('winston');

// First logger uses a format configured on logger
const logger1 = winston.createLogger({
  level: 'info',
  transports: new winston.transports.Console(),
  format: winston.format.simple()
});


// Second logger uses a format configured on transport
const logger2 = winston.createLogger({
  level: 'info',
  transports: new winston.transports.Console({
    format: winston.format.simple()
  })
});

logger1.info(new Error('err message'));   // logs expected 'err message'
logger2.info(new Error('err message'));   // logs 'undefined'

ليس من الواضح بالنسبة لي السلوك الذي ينبغي تفضيله.

ال 3 كومينتر

أعتقد أن هذا قد يكون بسبب السلوك غير المتسق بين أجهزة تسجيل بيانات Winston وعمليات النقل عند تطبيق التنسيقات. في winston-transport ، يقوم جزء من وظيفة TransportStream _write بما يلي:

transformed = this.format.transform(Object.assign({}, info), this.format.options);

يبدو أن الكود ذي الصلة في winston / logger.js يفعل هذا:

this.push(this.format.transform(info, this.format.options));

إليك وصف مبسط للمشكلة.

const winston = require('winston');

// First logger uses a format configured on logger
const logger1 = winston.createLogger({
  level: 'info',
  transports: new winston.transports.Console(),
  format: winston.format.simple()
});


// Second logger uses a format configured on transport
const logger2 = winston.createLogger({
  level: 'info',
  transports: new winston.transports.Console({
    format: winston.format.simple()
  })
});

logger1.info(new Error('err message'));   // logs expected 'err message'
logger2.info(new Error('err message'));   // logs 'undefined'

ليس من الواضح بالنسبة لي السلوك الذي ينبغي تفضيله.

أتساءل عما إذا كانت هذه هي الحالة نفسها أيضًا عندما لا يقوم برنامج Winston بتسجيل بعض الكائنات بشكل صحيح ويطبعها كـ [object Object] بينما تطبع الكائنات الأخرى بدون مشكلة

تضمين التغريدة
شكرا لك ، اكتشاف رائع! قدمت حلاً بسيطًا لمشكلتي ، والذي كان هو نفسه https://github.com/winstonjs/winston/issues/1758

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