winston
إصدار؟ _ 3.2.1winston@2
winston@3
node -v
النواتج: _ v12.8.1يبدو أن 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'
ليس من الواضح بالنسبة لي السلوك الذي ينبغي تفضيله.
أتساءل عما إذا كانت هذه هي الحالة نفسها أيضًا عندما لا يقوم برنامج Winston بتسجيل بعض الكائنات بشكل صحيح ويطبعها كـ [object Object]
بينما تطبع الكائنات الأخرى بدون مشكلة
تضمين التغريدة
شكرا لك ، اكتشاف رائع! قدمت حلاً بسيطًا لمشكلتي ، والذي كان هو نفسه https://github.com/winstonjs/winston/issues/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));
إليك وصف مبسط للمشكلة.
ليس من الواضح بالنسبة لي السلوك الذي ينبغي تفضيله.