winston
إصدار؟ _ 3.1.0winston@2
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);
}
تم تسجيل رسالة خطأ فعلية على الأقل. من الناحية المثالية - مع المكدس.
لا يعتمد على المنسق 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 الافتراضي به معالج للأخطاء ، لذلك تحتاج فقط إلى إرفاقه كمنسق.
مثال؟
لذلك ، اتضح أنني كنت مخطئًا بشأن منسق الخطأ. إنه ليس في 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)
لا ينسخ خاصية المكدس في:
لذلك في الأساس ، إذا كنت أريد تتبع المكدس ، فيجب علي إما
إنه عام 2021 وما زال لا يعمل مع حالات الخطأ. لقد توقفت عن استخدام هذا.
هذا هو لأعلى ، وأعتقد أن هذا يجب أن يأخذ في الاعتبار.
لقد قمت بترقية winston من 2 إلى 3 ، لكنني الآن أخفض الدرجة إلى 2 بسبب هذا.
الرجاء DABH إعادة فتح هذه المشكلة
شكرا لعملك بالرغم من ذلك
هذه مشكلة بالغة الأهمية لتطبيقنا ، فنحن نستخدم Winston وعندما تحدث أخطاء لا توجد طريقة لرؤية المكدس دون تعديل .error
هذه مشكلة بالغة الأهمية لتطبيقنا ، فنحن نستخدم Winston وعندما تحدث أخطاء لا توجد طريقة لرؤية المكدس دون تعديل
.error
لدي نفس المشكلة
مرحبا شباب!
لقد قمت بإصلاح ذلك بتنسيق errors
.
https://github.com/winstonjs/logform/pull/118
التعليق الأكثر فائدة
لذلك ، اتضح أنني كنت مخطئًا بشأن منسق الخطأ. إنه ليس في Winston بعد ، ولكنه موجود في [email protected] ، وعليك استخدامه مع المنسقين
metadata
وjson
.لذا ، نعم ، هناك الكثير من المحاذير لبدء العمل. سيكون من الأفضل لو كان بإمكانك استخدامه بمفرده ، لكنه أفضل من لا شيء.