Winston: 3.0.0-rc1 - غير قادر على تسجيل الطوابع الزمنية

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

لقد اتبعت المثال من الوثائق ، وأنشأت أداة تسجيل كما هو موضح أدناه:

const { createLogger, format, transports } = require('winston');

const logger = createLogger(
    {
        level: 'info',
        transports: [new transports.Console({
            showLevel: false,
            colorize: true,
            timestamp: true
        })
        ]
    }
);

logger.info('Server started');

لكن يبدو أنني أحصل على الطوابع الزمنية. أحصل على الإخراج التالي بالأبيض والأسود:

{"message": "بدأ الخادم" ، "المستوى": "المعلومات"}

استنادًا إلى الوثائق الموجودة على https://github.com/winstonjs/winston/blob/master/docs/transports.md#console -transport ، فإن تعيين علامة الطابع الزمني على true يجب أن يضع طابعًا زمنيًا افتراضيًا.

لقد حاولت حتى من خلال إعادة طابع زمني مخصص عن طريق تمرير وظيفة ولكن حتى ذلك لا يظهر. ربما فاتني شيء ولكن يبدو أن أيا من الخيارات يعمل ، أي. تلوين ، showLevel ، طابع زمني.

أم أن الوثائق غير متزامنة؟

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

تضمين التغريدة

استخدم تنسيق printf مثل هذا:

const { createLogger, format, transports } = require('winston')
const { colorize, combine, timestamp, printf } = format

// Define your custom format with printf.
const myFormat = printf(info => {
  return `${info.timestamp} ${info.level}: ${info.message}`
})

const logger = createLogger({
  format: combine(
    timestamp(),
    colorize(),
    myFormat
  ),
  transports: [new transports.Console()]
})

logger.info('foo') // -> 2018-02-21T03:55:19.236Z info: foo

ال 13 كومينتر

لا توجد تحديثات حول هذه القضية حتى الآن؟ أنا أواجه نفس المشكلة. يعمل على [email protected] ولكن ليس على [email protected]

ألق نظرة على التنسيقات التي يمكنك استخدامها مع [email protected] .

const { createLogger, format, transports } = require('winston')

const logger = createLogger({
  level: 'info',
  transports: new transports.Console({
    format: format.combine(
      format.timestamp({
        format: 'YYYY-MM-DD' // Optional for choosing your own timestamp format.
      }),
      format.json()
    )
  })
})

logger.info('Server started')

المثال يطبع ما يلي:

{"message": "بدأ الخادم" ، "المستوى": "المعلومات" ، "الطابع الزمني": "2018-01-17T15: 20: 55.621Z"}

أو باستخدام خيار التنسيق:

{"message": "بدأ الخادم" ، "المستوى": "المعلومات" ، "الطابع الزمني": "2018-01-17"}

لماذا لا يعمل format.timestamp بدون الإعلان عن format.json بعد format.timestamp ؟

أريد فقط بسيطًا في بداية السطر تمامًا كما كان من قبل ، لا أريد تنسيق json
[2018-01-17T15: 20: 55.621Z] INFO sdfsdfsdfsdfdfasfsadf ، كيف يمكنني تحقيق ذلك؟

في الإصدار 2.3.1 يمكنني تحقيق:
2018-02-12T18:50:25.472Z - INFO: Starting up the process

مع:

const winston = require('winston');

const logger = new (winston.Logger)({
  transports: [
    new (winston.transports.Console)({ timestamp: true, colorize: true}),
  ],
  exceptionHandlers: [
    new (winston.transports.Console)({ timestamp: true, colorize: true }),
  ],
  level: 'INFO',
  levels: {
    FATAL: 0,
    ERROR: 1,
    WARN: 2,
    INFO: 3,
    DEBUG: 4
  },
  colors: {
    INFO: 'blue',
    WARN: 'green',
    ERROR: 'yellow',
    FATAL: 'red'
  }
});

module.exports = logger

كنت أتمنى استخدام التسجيل "البسيط" لسطر النص. حاولت متابعة المستندات:

const winston = require('winston');
const logger = winston.createLogger({
    format: winston.format.combine(
        winston.format.timestamp(),
        winston.format.colorize(),
        winston.format.simple()
    ),
    transports: [new winston.transports.Console()]
});

ولكن ينتهي الأمر بخلط النص و JSON مثل:

info: GET /alice?bob {"timestamp":"2018-02-21T02:52:31.452Z"}

كنت آمل أن أبدأ كل سطر بالطابع الزمني ، وطباعة الطابع الزمني بمفرده. شيء مثل:

2018-02-21T02:52:31.452Z info: GET /alice?bob

لكن التعليقات أعلاه تشير إلى أن هذا ممكن فقط باستخدام النمط الأقدم لخيارات التمرير لمُنشئ Console() .

أي اقتراحات؟ أم أنني أطرح السؤال الخطأ؟ بمعنى ، هل يفضل محللو السجلات JSON هذه الأيام؟ TIA.

تضمين التغريدة

استخدم تنسيق printf مثل هذا:

const { createLogger, format, transports } = require('winston')
const { colorize, combine, timestamp, printf } = format

// Define your custom format with printf.
const myFormat = printf(info => {
  return `${info.timestamp} ${info.level}: ${info.message}`
})

const logger = createLogger({
  format: combine(
    timestamp(),
    colorize(),
    myFormat
  ),
  transports: [new transports.Console()]
})

logger.info('foo') // -> 2018-02-21T03:55:19.236Z info: foo

ChrisAlderson أنت الرجل ، أيضًا إذا كنت تريد عرض splat فقد عززت إجابتك بـ:
"
const vsprintf = تتطلب ('sprintf-js'). vsprintf ؛

const myFormat = printf (info => ${info.timestamp} ${info.level}: ${vsprintf(info.message, ...(info.splat || []))} )
"

ChrisAlderson ، شكرا جزيلا! لم تكن الوثائق واضحة بالنسبة لي. مقدر جدا!

شكرا لمساعدة الناس خارجChrisAlderson. المساهمات في الوثائق لتحسين شرح كيفية عمل الأشكال ستكون موضع ترحيب كبير 👍

ملاحظة: كن حذرًا عند استخدام الطابع الزمني مع البيانات الوصفية ، فمن الواضح أن استخدام كلتا وظيفتي التنسيق يؤدي إلى وضع الطابع الزمني على هيئة info.metadata.timestamp بدلاً من info.timestamp

في حال احتاج شخص ما إلى تسجيل بيانات وصفية إضافية ، بما في ذلك مكدس الأخطاء ، فإن المقتطف أدناه يؤدي المهمة (ملاحظة: يستخدم المثال تنسيق إخراج بسيط). الأهداف المقصوصة أدناه تستهدف armadillojim الناتج المتوقع (الموصوف سابقًا) وهو تحسين بسيط يعتمد على إجابةChrisAlderson .

كما هو موضح بواسطة OzzyTheGiant ، عند استخدام الطابع الزمني مع البيانات الوصفية ، يتم الوصول إلى timestamp كخاصية metadata ، وليس info .

import winston from 'winston';

// Creates the default formatter.
// We deconstruct "metadata" into "timestamp" and "meta", and use them in the default formatter.
const logFormat = winston.format.printf((info) => {
  const { timestamp, ...meta } = info.metadata;
  return `${timestamp} ${info.level}: ${info.message} ${JSON.stringify(meta)}`;
});

// Creates the logger. "padLevels", "colorize" and "padLevels" are optional.
logger = winston.createLogger({
  format: winston.format.combine(
    winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
    winston.format.padLevels(),
    winston.format.metadata(),
    winston.format.errors({ stack: true }),
    logFormat,
    winston.format.colorize({ all: true })
  ),
  transports: [new winston.transports.Console()],
});



logger.info('Simple log');
logger.info('Logger Info', { logLevel: 'info', colorize: { all: true } });
logger.error('', new Error('Logger error'));

انتاج:

// 2019-05-11 00:20:53 info:     Simple log {}
// 2019-05-11 00:20:53 info:     Logger Info {"logLevel":"info","colorize":{"all":true}}
// 2019-05-11 00:20:53 error:    Logger error {"stack":"Logger error\n    at ...

لماذا لا يعمل format.timestamp بدون الإعلان عن format.json بعد format.timestamp ؟

لا يزال هذا هو الشيء بعد عامين.

هذا يعمل
format: winston.format.combine( winston.format.timestamp(), winston.format.json() ),

هذا لا
format: winston.format.combine( winston.format.json(), winston.format.timestamp() ),

لكتابة السجلات إلى ملف

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