Winston: في 3.0.0 لا يمكنني تسجيل الكائنات بدون استخدام JSON.stringify

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

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

هذا هو توصيفي لبيئة التطوير:

"const {createLogger، format، transports} = تتطلب ('winston') ؛
const {تركب ، طابع زمني ، تسمية ، printf} = تنسيق ؛

const environment = process.env.NODE_ENV;
const timestampFormat = 'YYYY-MM-DD HH:mm:SS';

const loggerFormat = printf((info) => {
    return `[${info.label}] ${info.message}`;
});
logger = createLogger({
    format: combine(
        label({ label: 'immoliste' }),
        format.colorize({ all: true }),
        format.splat(),
        format.simple(),
        loggerFormat
    ),
    transports: [
        new transports.Console({
            level: 'debug',
            colorized: true
        })
    ]
});

فعل هذا:

logger.error('Error sending contact message:', JSON.stringify(err));

حصلت فقط على:

[mylabel] Error sending contact message:

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

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

على محمل الجد ، هذا يبدو وكأنه تخفيض. باستخدام Winston 2 ، يمكنني استبدال كل console.X بـ winston.X . لماذا فجأة علامات التنسيق القبيح؟

ال 18 كومينتر

+1

eyp هل يمكنك تجربة هذا؟

logger.error('Error sending contact message:%o', {foo: "bar"});

المصدر الأساسي هنا:

https://github.com/winstonjs/logform/blob/master/splat.js

والذي يمكنك رؤيته يستخدم util.format من العقدة

https://nodejs.org/api/util.html#util_util_format_format_args

لذا فإن %o و %O و %j يقوم بهذه المهمة

%o

يعمل مثل السحر ، لم أكن أعلم أن Winston يستخدم نفس معلمات التنسيق من use.format.

شكرا لك!

وينستون 3.1.0
أحاول هذا كما اكتب هنا:
const debugConsole = new winston.transports.Console ({
المستوى: "تصحيح" ،
التنسيق: winston.format.combine (winston.format.simple ()) ،
مقبض الاستثناءات: صحيح
})
logger.add (debugConsole)

في الكود الذي أستخدمه: logger.debug ('٪ o'، req.query)
أرى كائن json ، لكني أرى أيضًا "٪ o" من قبل ، سجل وحدة التحكم أدناه:
التصحيح:٪ o {"offset": "73000"، "count": "3"، "timestamp": "2018-10-29 15:02:08"}
ماذا أفعل worng؟

بشكل عام ، يتم استدعاء٪ o من خلال util.format () حيث تحدد العنصر الذي تريده هناك. من الإخراج يبدو أنك لا تحتاج حتى إلى٪ o لأنه يتم عرض الكائن.

فقط استخدم هذا بدلاً من ذلك ، logger.debug (req.query) ويجب أن يعمل. أو يمكنك تخزينه في متغير باستخدام تنسيق util.Format مثل هذا
استعلام ثابت
logger.debug (استعلام منسق)

frenzymind أو جرب الحل الذي تم إرساله إلى الإصدار الأصلي بواسطةmingchuno.

فقط استخدم هذا بدلاً من ذلك ، logger.debug (req.query) ويجب أن يعمل

eponymz في هذه الحالة هناك: تصحيح: [كائن الكائن] {"timestamp": "2018-10-30 11:14:04"}

استعلام ثابت

إنه يعمل ، لكنه صاخب.

هل الناتج من الثانية هو ما كنت تريده؟ أعني بذلك ، إذا كنت تريد الاستعلام في السجلات ، فهل يتم عرضه. إن لم يكن جرب الحل البديل الذي تم ذكره قبل نشر mingchuno.

نعم ، الطريقة الثانية تعمل كما أريد. أرى بيانات كائن json.
إذا فهمت بشكل صحيح ، فقد نصح mingchuno باستخدام٪ o في السلسلة ، لأن استخدام winston "تحت الغطاء". أحاول ذلك وهذا يعمل ، لكن٪ o مطبوع أيضًا في حالتي. أقوم أيضًا بإضافة تنسيق splat () إلى مستوى التصحيح الخاص بي ، لكن لا شيء يتغير. هل اشتقت لشيء؟

نعم ، أرى %o معلقًا مسبقًا على فحص الكائن. أفترض أن هذا نوع من الخطأ؟

هل هذا اختيار تصميم متعمد؟ إنه ينحرف عن المعيار قليلاً (واستغرق مني ساعة جيدة للعثور عليه) بدلاً من

console.log('Log me plz: ', {'ok': 'logged'});

الاضطرار إلى (winston 3.x) تغيير جميع مكالمات التسجيل إلى

logger.info('Log me plz: %o', {'ok':'logged'});

عذرا ، هل أنا على حق؟ أنا في حيرة...

على محمل الجد ، هذا يبدو وكأنه تخفيض. باستخدام Winston 2 ، يمكنني استبدال كل console.X بـ winston.X . لماذا فجأة علامات التنسيق القبيح؟

لذا فإن الإصلاح هو إلحاق %o بكل بيان تسجيل أريد طباعته كائنًا؟

نعم!

لا يمكنني قبول استخدام٪ o دائمًا وجعلت هذا الحل البسيط:

const prettyJson = format.printf(info => {
  if (info.message.constructor === Object) {
    info.message = JSON.stringify(info.message, null, 4)
  }
  return `${info.level}: ${info.message}`
})

const logger = createLogger({
  level: 'info',
  format: format.combine(
    format.colorize(),
    format.prettyPrint(),
    format.splat(),
    format.simple(),
    prettyJson,
  ),
  transports: [
    new transports.Console({})
  ],
})

لذلك هذا المسجل ....

  logger.info({ hi: 123 })

... يتحول إلى هذا في وحدة التحكم

info: {
    "hi": 123
}

آمل أن أتمكن من مساعدتكم يا رفاق: D سيئ جدًا إذا كان لدينا دائمًا استخدامان "٪ o"

لا يمكنني قبول استخدام٪ o دائمًا وجعلت هذا الحل البسيط:

const prettyJson = format.printf(info => {
  if (info.message.constructor === Object) {
    info.message = JSON.stringify(info.message, null, 4)
  }
  return `${info.level}: ${info.message}`
})

const logger = createLogger({
  level: 'info',
  format: format.combine(
    format.colorize(),
    format.prettyPrint(),
    format.splat(),
    format.simple(),
    prettyJson,
  ),
  transports: [
    new transports.Console({})
  ],
})

لذلك هذا المسجل ....

  logger.info({ hi: 123 })

... يتحول إلى هذا في وحدة التحكم

info: {
    "hi": 123
}

آمل أن أتمكن من مساعدتكم يا رفاق: D سيئ جدًا إذا كان لدينا دائمًا استخدامان "٪ o"

لطيفة واحدة، لكن الغريب، هل أحتاج إلى القيام بذلك لكل مستوى مسجلي؟

فقط للحصول على معلومات ، من الأفضل استخدامها
`` جافا سكريبت
typeof info.message === 'كائن'
""
بدلا من

`` جافا سكريبت
info.message.constructor === كائن
""
يتجنب الأخطاء عندما تكون الرسالة فارغة أو غير محددة وسيتم عرض المصفوفات بشكل صحيح
(على سبيل المثال: [{hi: "456"}]

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