winston
الإصدار؟ _winston@2
winston@3
node -v
النواتج: v10.1.0عندما أستخدم النقل المدمج في وحدة التحكم ، فسيتم الكتابة إلى وحدة التحكم عند التشغيل بشكل طبيعي (على سبيل المثال node ./dist/index.js
) ولكن ليس إلى وحدة التحكم في تصحيح الأخطاء عند تصحيح الأخطاء من Visual Studio Code. المكالمات القياسية إلى console.log () / warn () / error () تكتب إلى وحدة التصحيح.
أتوقع أن تكتب جميع الرسائل إلى وحدة التحكم في تصحيح الأخطاء كما تفعل مع وحدة التحكم القياسية عند التشغيل بشكل طبيعي.
يبدو أن المشكلة تكمن في استخدام _stderr.write () و _stdout.write () في طريقة log () لتنفيذ النقل. إذا قمت باستبدال الشرط في عبارات if في 49 و 62 و 77 بـ false
حتى يتم استدعاء وظائف console.log () / warn () / error () ، فإن المخرجات تصل إلى مخرجات وحدة التحكم . من الواضح أن أحد الآثار الجانبية غير المرغوب فيها هو تجاهل eol المخصص.
يبدو وكأنه خطأ في vscode - لماذا تحتوي وحدة التصحيح الخاصة بهم على دعائم مثل _stdout
إذا لم نتمكن من الكتابة إليها بنجاح بهذا الشكل؟ بالطبع ، يمكن أن يكون لديك وسيلة نقل معدلة مثل الحل البديل الخاص بك والذي يعمل مع vscode ، ولكن قد لا يكون هذا مثاليًا. إذا كنت تعتقد أن هذا شيء يحتاج إلى الإصلاح في Winston ، فلا تتردد في تقديم أي أفكار :) لكنني لا أعتقد أنه يجب على Winston التحقق مما إذا كان يعمل في vscode ، بل يبدو أن وحدة تحكم vscode يجب أن تعمل بشكل أفضل.
يجب أن نعالج هذا ، لكننا بحاجة إلى مزيد من التحقيق.
لقد واجهت هذه المشكلة للتو وأردت إضافة فكرتي البسيطة جدًا: استخدم فقط console.log
، console.warn
و console.error
في الوقت الحالي ، يبحث وينستون عن [console._stderr] و [console._stdout] ، مفضلاً الكتابة إلى تلك التدفقات مباشرةً ، لكنه يتراجع إلى استخدام console.warn
، console.error
و console.log
إذا لم يكن متاحًا. تتوفر هذه الخصائص ( _stderr
و _stdout
) على مثيل وحدة التحكم العامة في node.js ، ومع ذلك ، فهي غير موثقة على أنها جزء من واجهة برمجة تطبيقات [console] وليست قابلة للعدد .
ما هو الجانب الإيجابي لاستخدام التدفقات مباشرة في وينستون بدلاً من استدعاء الأساليب؟ بالنسبة لي ، يعني console
في سياق جافا سكريبت على وجه التحديد الكائن console
، وليس "وحدة التحكم" بشكل عام أو كوكيل لعمليات الدفق. ألن تنجح الأساليب دائمًا؟ خاصة وأن هناك وسيلة نقل مضمنة في وينستون stream
، فإنني سأفسر "وحدة التحكم" على أنها مناسبة للتنمية المحلية بشكل أساسي.
يمتلك كود VS _ الخصائص المقابلة (ربما لأنه يعمل على عقدة) ، ولكن "الالتقاط" الافتراضي لوحدة التحكم في تصحيح الأخطاء هو "وحدة التحكم" - مما يعني على الأرجح أنهم قاموا بتثبيت الخطافات على مكالمات console.log
على وجه التحديد ، وليس على التدفقات نفسها. يقوم Ie VS Code بتوليد الإخراج ، ولكن لا يلتقطه. من المحتمل أنه مرتبط بهذا الملف
كما ذكر آخرون ، يمكنك تغيير الإخراج الذي يلتقطه رمز VS ، أو تغيير ما يفعله النقل "وحدة التحكم" في Winston.
{
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "Launch Program",
"program": "${workspaceFolder}/index.js",
// Capture "std" instead of "console"
"outputCapture": "std"
}
]
}
ملاحظة ، إذا اتبعت النصيحة المرتبطة من @ adi7ya ، console.log
فيه - وهو ليس المكان الذي اتصلت فيه بـ Winston ، ولكن السطر الموجود في log
تجاوزه. لذلك ، قد يكون مفيدًا بشكل هامشي فقط ...
تحقق مع VS Code People لمعرفة ما إذا كان بإمكاننا إجراء إعدادات vsc الضرورية لمخرجات نقل وحدة التحكم التي تلتقط الإعدادات الافتراضية: https://github.com/Microsoft/vscode/issues/69959 . خلاف ذلك ، يتم ربط التغييرات الضرورية لإعداد vsc من تعليقي هناك. ^^ إنه سؤال صحيح ، بالنسبة لوحدة التحكم ، إذا لم تفعل مجموعة من المحررين المشهورين الشيء "الصحيح" افتراضيًا ، فربما يجب علينا تغيير سلوك وحدة التحكم
هذا أيضًا لي ، لا يمكن أن أتفق أكثر مع @ victorandree.
أنا أستخدم وسيلة النقل المجردة هذه لأغراضي الخاصة في الوقت الحالي إذا وجدها أي شخص آخر مفيدة:
import winston from "winston";
import Transport from "winston-transport";
const { MESSAGE } = require("triple-beam");
const level = process.env.LOG_LEVEL || "info";
class SimpleConsoleTransport extends Transport {
log = (info: any, callback: any) => {
setImmediate(() => this.emit("logged", info));
console.log(info[MESSAGE]);
if (callback) {
callback();
}
};
}
export const logger = winston.createLogger({
level,
defaultMeta: {},
transports: [new SimpleConsoleTransport()]
});
يرجى التحقق من اقتراحي لحل هذا في # 1836
واجهت أيضًا هذه المشكلة ، ولا يبدو أنها خاصة بـ VSCode - إذا قمت بتشغيل node --inspect
ثم قمت بإرفاقها من Chrome بـ chrome://inspect
أرى فقط المكالمات إلى console.log/etc
وليس أي شيء يذهب إلى وحدة النقل.
التعليق الأكثر فائدة
لقد واجهت هذه المشكلة للتو وأردت إضافة فكرتي البسيطة جدًا: استخدم فقط
console.log
،console.warn
وconsole.error
في الوقت الحالي ، يبحث وينستون عن [console._stderr] و [console._stdout] ، مفضلاً الكتابة إلى تلك التدفقات مباشرةً ، لكنه يتراجع إلى استخدام
console.warn
،console.error
وconsole.log
إذا لم يكن متاحًا. تتوفر هذه الخصائص (_stderr
و_stdout
) على مثيل وحدة التحكم العامة في node.js ، ومع ذلك ، فهي غير موثقة على أنها جزء من واجهة برمجة تطبيقات [console] وليست قابلة للعدد .ما هو الجانب الإيجابي لاستخدام التدفقات مباشرة في وينستون بدلاً من استدعاء الأساليب؟ بالنسبة لي ، يعني
console
في سياق جافا سكريبت على وجه التحديد الكائنconsole
، وليس "وحدة التحكم" بشكل عام أو كوكيل لعمليات الدفق. ألن تنجح الأساليب دائمًا؟ خاصة وأن هناك وسيلة نقل مضمنة في وينستونstream
، فإنني سأفسر "وحدة التحكم" على أنها مناسبة للتنمية المحلية بشكل أساسي.يمتلك كود VS _ الخصائص المقابلة (ربما لأنه يعمل على عقدة) ، ولكن "الالتقاط" الافتراضي لوحدة التحكم في تصحيح الأخطاء هو "وحدة التحكم" - مما يعني على الأرجح أنهم قاموا بتثبيت الخطافات على مكالمات
console.log
على وجه التحديد ، وليس على التدفقات نفسها. يقوم Ie VS Code بتوليد الإخراج ، ولكن لا يلتقطه. من المحتمل أنه مرتبط بهذا الملفكما ذكر آخرون ، يمكنك تغيير الإخراج الذي يلتقطه رمز VS ، أو تغيير ما يفعله النقل "وحدة التحكم" في Winston.
ملاحظة ، إذا اتبعت النصيحة المرتبطة من @ adi7ya ،
console.log
فيه - وهو ليس المكان الذي اتصلت فيه بـ Winston ، ولكن السطر الموجود فيlog
تجاوزه. لذلك ، قد يكون مفيدًا بشكل هامشي فقط ...