Winston: Bagaimana cara menyesuaikan format cap waktu?

Dibuat pada 10 Nov 2017  ·  18Komentar  ·  Sumber: winstonjs/winston

Saya menggunakan 3.0.0-rc1 dan dokumennya tidak jelas tentang cara menyesuaikan format stempel waktu. Tolong bantu.

Terima kasih,
Alvaro

Komentar yang paling membantu

Ini sangat rumit untuk persyaratan paling sederhana hanya dengan mencetak stempel waktu (yang seharusnya tetap default):/

Semua 18 komentar

Anda dapat membaca kode sumber untuk membantu Anda menyesuaikan format. saya dapat memberikan contoh saya.

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' })
    ]
});

Ini sangat rumit untuk persyaratan paling sederhana hanya dengan mencetak stempel waktu (yang seharusnya tetap default):/

Inilah yang saya lakukan...

//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;

PS Saya hanya mengatur timestamp: ke suatu fungsi karena saya tidak suka format default yang Anda dapatkan dengan mengatur timestamp: true, yaitu 2017-12-05T08:22:09.179Z

@jimwhurr - bagi saya, kode Anda (simpul v6.11.0) menghasilkan:

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)

Mengambil contoh di sini, saya membuat contoh mandiri yang lebih sederhana:

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')

Keluaran:

{"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"}

Hai, ini adalah opsi lain untuk masuk dengan stempel waktu (diuji pada 3.0.0-rc0):

const winston = membutuhkan('winston');
var customFormat = winston.format.combine(
winston.format(
function dynamicContent(info, pilihan) {
info.level = 'info';
jika(info.waktu) {
var dt = Tanggal baru(),
date_now = dt.getDate() < 10 ? '0'+ dt.getDate() : dt.getDate(),
bulan_sekarang = (dt.getMonth() + 1) < 10 ? '0'+ (dt.getMonth() + 1) : (dt.getMonth() + 1),
tahun_sekarang = dt.getFullYear(),
jam_sekarang = dt.getHours(),
mins_now = dt.getMinutes(),
detik_sekarang = dt.getSeconds(),
milisec_now = dt.getMilliseconds();
info.time = ' '+date_now+'-'+month_now+'-'+year_now+' '+hrs_now+':'+mins_now+':'+secs_now+':'+millisec_now+' ';
}
informasi kembali;
}
)(),
winston.format.simple() //format output, juga memungkinkan penggunaan: .json() (bukan .simple)
);

const logger = winston.createLogger({
tingkat: 'info',
format: format kustom,
transportasi: [
winston.transports.File baru ({ nama file: 'logs.log' })
]
});
module.exports = logger;`

Dan untuk log:

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

Mungkin itu akan membantu.

anda dapat menyesuaikan stempel waktu dengan string format:

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: ...
});

Ini harus ada di dokumen. @felipemullen Terima kasih!

@felipemullen terima kasih telah memberikan sampel itu. Setuju dengan @ricardoaat ini harus ada di dokumen, jadi ... sekarang: contoh/custom-timestamp.js

@youngkylejan oh oh.....Itu bantuan yang bagus...
Tapi saya punya masalah...apa {} di akhir log?

[2018-05-14 04:39:52] [INFO] API berjalan di localhost:3000 {}

Saya baru mengenal Winston dan, harus dikatakan, dokumennya sangat sulit diikuti :(

Entah bagaimana, saya berakhir dengan solusi yang tampaknya lebih sederhana berikut:

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

@hosseinGanjyar
Mengubah
info[MESSAGE] = info.message + ' ' + JSON.stringify(...);
untuk hanya
info[MESSAGE] = info.message;

Ini berhasil untuk saya.

Mempersiapkan:

  • Log JSON
  • Stempel waktu
  • Rotasi log
  • Pencatatan file dan konsol
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;

Ini semua untuk winston 3.0.0 dan @types/winston 2.3.9

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

ini mengembalikan stempel waktu yang hanya merupakan waktu di zona waktu saat ini.
untuk format file yang saya gunakan

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

kemudian

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

mungkin tidak perlu level dua kali. tapi itulah yang saya gunakan saat ini.

anda dapat menyesuaikan stempel waktu dengan string format:

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: ...
});

Penolong. Terimakasih banyak!!!

Bagi mereka yang ada di sini untuk mengetahui cara menyesuaikan string format selain YYYY-MM-DD HH:mm:ss : winston menggunakan fecha di bawah tenda , jadi Anda dapat merujuk ke dokumentasi fecha .

Semua contoh itu menghapus parameter istirahat di log. Jika Anda ingin menggunakan format.simple() dan hanya menambahkan stempel waktu ke awal dan menghapusnya dari istirahat, ini mungkin cocok untuk Anda:

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(),
  ),
}))
Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

xungwoo picture xungwoo  ·  3Komentar

ghost picture ghost  ·  4Komentar

Nepoxx picture Nepoxx  ·  4Komentar

JaehyunLee-B2LiNK picture JaehyunLee-B2LiNK  ·  3Komentar

alditis picture alditis  ·  3Komentar