Saya menggunakan 3.0.0-rc1 dan dokumennya tidak jelas tentang cara menyesuaikan format stempel waktu. Tolong bantu.
Terima kasih,
Alvaro
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:
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(),
),
}))
Komentar yang paling membantu
Ini sangat rumit untuk persyaratan paling sederhana hanya dengan mencetak stempel waktu (yang seharusnya tetap default):/