Winston: لا يكتب نقل وحدة التحكم إلى وحدة التصحيح

تم إنشاؤها على ٦ ديسمبر ٢٠١٨  ·  9تعليقات  ·  مصدر: winstonjs/winston

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

  • _ winston الإصدار؟ _

    • [] winston@2

    • [x] winston@3

  • _ node -v النواتج: v10.1.0
  • _ نظام التشغيل؟ _ Windows
  • _Language؟ _ TypeScript

ما المشكلة؟

عندما أستخدم النقل المدمج في وحدة التحكم ، فسيتم الكتابة إلى وحدة التحكم عند التشغيل بشكل طبيعي (على سبيل المثال 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 المخصص.

bug help wanted important

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

لقد واجهت هذه المشكلة للتو وأردت إضافة فكرتي البسيطة جدًا: استخدم فقط 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 تجاوزه. لذلك ، قد يكون مفيدًا بشكل هامشي فقط ...

ال 9 كومينتر

يبدو وكأنه خطأ في vscode - لماذا تحتوي وحدة التصحيح الخاصة بهم على دعائم مثل _stdout إذا لم نتمكن من الكتابة إليها بنجاح بهذا الشكل؟ بالطبع ، يمكن أن يكون لديك وسيلة نقل معدلة مثل الحل البديل الخاص بك والذي يعمل مع vscode ، ولكن قد لا يكون هذا مثاليًا. إذا كنت تعتقد أن هذا شيء يحتاج إلى الإصلاح في Winston ، فلا تتردد في تقديم أي أفكار :) لكنني لا أعتقد أنه يجب على Winston التحقق مما إذا كان يعمل في vscode ، بل يبدو أن وحدة تحكم vscode يجب أن تعمل بشكل أفضل.

sirockin هل تقوم بتطوير امتداد vscode؟ لقد صادفت هذه المشكلة المماثلة في vsode. على أي حال ، يمكنك تجاوز طريقة السجل لنقل وحدة التحكم لجعلها تعمل.

يجب أن نعالج هذا ، لكننا بحاجة إلى مزيد من التحقيق.

لقد واجهت هذه المشكلة للتو وأردت إضافة فكرتي البسيطة جدًا: استخدم فقط 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 وليس أي شيء يذهب إلى وحدة النقل.

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