Winston: كيفية تخصيص تنسيق الطابع الزمني؟

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

أنا أستخدم 3.0.0-rc1 والمستندات ليست واضحة بشأن كيفية تخصيص تنسيق الطابع الزمني. الرجاء المساعدة.

شكرا،
ألفارو

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

هذا معقد للغاية بالنسبة لأبسط متطلبات مجرد طباعة طابع زمني (والذي يجب أن يكون افتراضيًا على أي حال): /

ال 18 كومينتر

يمكنك قراءة التعليمات البرمجية المصدر لمساعدة نفسك على تخصيص التنسيق. يمكنني أن أعطيك مثالا لي.

const winston = require('winston');
const moment = require('moment');
const util = require('util');
const MESSAGE = Symbol.for('message');

const logger = winston.createLogger({
    level: 'info',
    format: winston.format.combine(
        winston.format(function(info, opts) {
            prefix = util.format('[%s] [%s]', moment().format('YYYY-MM-DD hh:mm:ss').trim(), info.level.toUpperCase());
            if (info.splat) {
                info.message = util.format('%s %s', prefix, util.format(info.message, ...info.splat));
            } else {
                info.message = util.format('%s %s', prefix, info.message);
            }
            return info;
        })(),
        winston.format(function(info) {
            info[MESSAGE] = info.message + ' ' + JSON.stringify(
                Object.assign({}, info, {
                    level: undefined,
                    message: undefined,
                    splat: undefined
                })
            );
            return info;
        })()
    ),
    transports: [
        new winston.transports.Console(),
        new winston.transports.File({ filename: './logs/bitcoin.log' })
    ]
});

هذا معقد للغاية بالنسبة لأبسط متطلبات مجرد طباعة طابع زمني (والذي يجب أن يكون افتراضيًا على أي حال): /

هذا ما أفعله ...

//logger.js

const winston = require('winston');
const moment = require('moment');

// create formatter for dates used as timestamps
//const tsFormat = () => (new Date()).toLocaleTimeString();
const tsFormat = () => moment().format('YYYY-MM-DD hh:mm:ss').trim();

// define a logger with 2 transports - console and a file
const logger = new (winston.Logger)({
  transports: [
    // colorize the output to the console
    new (winston.transports.Console)({
        timestamp: tsFormat,
        colorize: true
    }),
    new winston.transports.File({
        filename: './logs/ttracker.log',
        timestamp: tsFormat,            // makes timestamp 'pretty'
        json: false                 // makes log format just like console output
    })
  ]
});

// set logging level one of { error: 0, warn: 1, info: 2, verbose: 3, debug: 4, silly: 5 }
logger.level = 'debug';

module.exports = logger;

ملاحظة: لقد قمت فقط بتعيين الطابع الزمني: إلى وظيفة لأنني لا أحب التنسيق الافتراضي الذي تحصل عليه من خلال ضبط الطابع الزمني: صحيح ، على سبيل المثال ، 2017-12-05T08: 22: 09.179Z

jimwhurr - بالنسبة لي ، ينتج الكود الخاص بك (العقدة v6.11.0):

Error: winston.Logger was moved in [email protected].
Use a winston.createLogger instead.
    at new <anonymous> (/Users/adrian/Documents/winston_test/node_modules/winston/lib/winston/common.js:162:15)
    at Object.<anonymous> (/Users/adrian/Documents/winston_test/index.js:7:16)
    at Module._compile (module.js:570:32)
    at Object.Module._extensions..js (module.js:579:10)
    at Module.load (module.js:487:32)
    at tryModuleLoad (module.js:446:12)
    at Function.Module._load (module.js:438:3)
    at Module.runMain (module.js:604:10)
    at run (bootstrap_node.js:389:7)
    at startup (bootstrap_node.js:149:9)

من خلال أخذ الأمثلة هنا ، قمت بإنشاء مثال مستقل أبسط:

https://gist.github.com/ah/d02bd4ff238e5923fcf5369233e51401

const winston = require('winston');
const MESSAGE = Symbol.for('message');

const jsonFormatter = (logEntry) => {
  const base = { timestamp: new Date() };
  const json = Object.assign(base, logEntry)
  logEntry[MESSAGE] = JSON.stringify(json);
  return logEntry;
}

const logger = winston.createLogger({
  level: 'info',
  format: winston.format(jsonFormatter)(),
  transports: new winston.transports.Console(),
});

logger.info('message content', { "context": "index.js", "metric": 1 })
logger.info('message content 2')

انتاج:

{"timestamp":"2017-12-07T16:07:10.518Z","context":"index.js","metric":1,"level":"info","message":"message content"}
{"timestamp":"2017-12-07T16:07:10.520Z","message":"message content 2","level":"info"}

مرحبًا ، إليك خيار آخر للتسجيل بالطابع الزمني (تم اختباره في 3.0.0-rc0):

const winston = تتطلب ('winston') ؛
var customFormat = winston.format.combine (
winston.format (
وظيفة dynamicContent (معلومات ، خيارات) {
info.level = 'info' ؛
إذا (info.time) {
var dt = تاريخ جديد () ،
date_now = dt.getDate () <10؟ '0' + dt.getDate (): dt.getDate ()،
month_now = (dt.getMonth () + 1) <10؟ '0' + (dt.getMonth () + 1): (dt.getMonth () + 1) ،
year_now = dt.getFullYear () ،
hrs_now = dt.getHours () ،
mins_now = dt.getMinutes () ،
secs_now = dt.getSeconds () ،
millisec_now = dt.getMilliseconds () ،
info.time = '' + date_now + '-' + month_now + '-' + year_now + '+ hrs_now +': '+ mins_now +': '+ secs_now +': '+ millisec_now +' '؛
}
معلومات العودة
}
) () ،
winston.format.simple () // إخراج تنسيق ، واستخدام ممكن أيضًا: .json () (بدلاً من .simple)
) ؛

const logger = winston.createLogger ({
المستوى: "معلومات" ،
التنسيق: تنسيق مخصص ،
النقل: [
new winston.transports.File ({filename: 'logs.log'})
]
}) ؛
module.exports = المسجل ؛ `

وللسجل:

logger.log({ time: true, level: 'info', message: 'message for logging' });

قد يكون من المفيد.

يمكنك تخصيص الطابع الزمني بسلسلة تنسيق:

winston.createLogger({
    level: ...
    format: winston.format.combine(
        winston.format.label({ label: '[my-label]' }),
        winston.format.timestamp({
            format: 'YYYY-MM-DD HH:mm:ss'
        }),
        winston.format.simple()
    ),
    transports: ...
});
winston.createLogger({
    level: ...
    format: winston.format.combine(
        winston.format.label({ label: '[my-label]' }),
        winston.format.timestamp({
            format: 'YYYY-MM-DD HH:mm:ss'
        }),
        winston.format.simple()
    ),
    transports: ...
});

يجب أن يكون هذا في المستندات. felipemullen شكرا لك!

felipemullen شكرا لتقديم تلك العينة. اتفق مع ricardoaat يجب أن يكون هذا في المستندات ، لذلك ... الآن هو: أمثلة / custom-timestamp.js

youngkylejan أوه أوه ..... هذه مساعدة جيدة ...
لكن لدي مشكلة ... ما هو {} في نهاية السجل؟

[2018-05-14 04:39:52] [INFO] API تعمل على المضيف المحلي: 3000 {}

أنا جديد على وينستون ، ولا بد لي من القول إنه من الصعب جدًا متابعة المستندات:

بطريقة ما ، انتهى بي الأمر بالحل الأبسط التالي على ما يبدو:

winston.createLogger({
    level: ...
    format: winston.format.printf(info => `${new Date().toISOString()} ${info.message}`),
    transports: ...
});

تضمين التغريدة
يتغير
info[MESSAGE] = info.message + ' ' + JSON.stringify(...);
لمجرد
info[MESSAGE] = info.message;

هذا عمل لي.

يثبت:

  • سجلات JSON
  • الطوابع الزمنية
  • تناوب السجل
  • تسجيل الملف ووحدة التحكم
import winston from 'winston';
import DailyRotateFile from 'winston-daily-rotate-file';
import fs from 'fs';
import path from 'path';

const LOG_DIR = path.normalize(`${process.cwd()}/logs`);

if (!fs.existsSync(LOG_DIR)) {
  fs.mkdirSync(LOG_DIR);
}

const logger = winston.createLogger({
  exitOnError: false,
  silent: process.env.SUPPRESS_LOGS,
  level: process.env.LOG_LEVEL || 'info',
  format: winston.format.combine(
    winston.format.timestamp({
      format: 'YYYY-MM-DD HH:mm:ss',
    }),
    winston.format.json(),
  ),
  transports: [
    new winston.transports.Console(),
    new DailyRotateFile({
      dirname: LOG_DIR,
      filename: '%DATE%.log',
      datePattern: 'YYYY-MM-DD-HH',
      zippedArchive: false,
      maxSize: '1m',
      maxFiles: '14d',
    }),
  ],
});

export default logger;

هذا كل شيء لـ winston 3.0.0 و @ type / winston 2.3.9

const consoleFormat = winston.format.printf(info => {
    const d = new Date();
    const timestamp = d.toLocaleTimeString();
    return `${timestamp} ${info.level}: ${info.message}`;

يؤدي هذا إلى إرجاع طابع زمني يمثل الوقت في المنطقة الزمنية الحالية فقط.
لتنسيق الملف الذي أستخدمه

const timestamp = `${d.toISOString()} (${d.toLocalTimeString()})`;

ومن بعد

const logger = winston.createLogger({
    level: "debug",
    format: fileFormat,
    transports: [ new winston.transports.File({ filename: "yourname.log", level: "debug"}) ]
});

ربما لا تحتاج إلى المستوى مرتين. ولكن هذا ما أستخدمه حاليًا.

يمكنك تخصيص الطابع الزمني بسلسلة تنسيق:

winston.createLogger({
    level: ...
    format: winston.format.combine(
        winston.format.label({ label: '[my-label]' }),
        winston.format.timestamp({
            format: 'YYYY-MM-DD HH:mm:ss'
        }),
        winston.format.simple()
    ),
    transports: ...
});

منقذ الحياة. شكرا جزيلا!!!

بالنسبة لأولئك الموجودين هنا لمعرفة كيفية تخصيص سلسلة التنسيق إلى جانب YYYY-MM-DD HH:mm:ss : يستخدم winston fecha تحت الغطاء ، لذلك يمكنك الرجوع إلى وثائق fecha .

كل هذه الأمثلة تزيل بقية المعلمات في السجلات. إذا كنت تريد استخدام format.simple () وإضافة الطابع الزمني فقط إلى البداية وإزالته من الراحة ، فقد يكون هذا مناسبًا لك:

const simpleFormat = format.simple()
const MESSAGE = Symbol.for('message')
const simpleTimestamp = format(info => {
  const { timestamp, ...rest } = info
  const simpled = simpleFormat.transform(rest)
  if (typeof simpled !== 'boolean') {
    // @ts-ignore
    simpled[MESSAGE] = `${timestamp} ${simpled[MESSAGE]}`
  }
  return simpled
})

logger.add(new transports.Console({
  format: format.combine(
      format.timestamp(),
      format.colorize(),
      simpleTimestamp(),
  ),
}))
هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات