Günlüklere zaman damgası eklemek istiyorum. Bunu başarmanın en iyi yolu nedir?
Yanıtlar:
Ben de aynı sorunu yaşıyordum. Bunu yapabilmemin iki yolu var.
Winston'ı dahil ettiğinizde, genellikle varsayılan olarak bir Konsol aktarımı eklemeye gelir. Bu varsayılan durumda zaman damgalarının çalışması için şunlardan birini yapmam gerekiyordu:
İlk:
var winston = require('winston');
winston.remove(winston.transports.Console);
winston.add(winston.transports.Console, {'timestamp':true});
İkinci ve daha temiz seçenek:
var winston = require('winston');
var logger = new (winston.Logger)({
transports: [
new (winston.transports.Console)({'timestamp':true})
]
});
Konsol aktarımı için diğer seçeneklerden bazıları burada bulunabilir :
Yukarıdaki cevaplar benim için işe yaramadı. Winston - 3.0.0-rc1'in en son sürümünü kullanarak günlüklerinize zaman damgası eklemeye çalışıyorsanız, bu harika çalıştı:
const {transports, createLogger, format} = require('winston');
const logger = createLogger({
format: format.combine(
format.timestamp(),
format.json()
),
transports: [
new transports.Console(),
new transports.File({filename: 'logs/error/error.log', level: 'error'}),
new transports.File({filename: 'logs/activity/activity.log', level:'info'})
]
});
'Format.combine ()' kullandım. Tüm aktarımlarımda zaman damgasına ihtiyacım olduğu için, her aktarımın içine değil, createLogger'a biçimlendirme seçeneğini ekledim. Konsol ve dosyadaki (activity.log) çıktım aşağıdaki gibidir:
{"message":"Connected to mongodb","level":"info","timestamp":"2018-02-01T22:35:27.758Z"}
{"message":"Connected to mongodb","level":"info","timestamp":"2018-02-01T22:35:27.758Z"}
Bu zaman damgasına 'format.combine ()' içinde her zamanki gibi formatlama ekleyebiliriz:
format.timestamp({format:'MM-YY-DD'})
Bunu da yapabiliriz
var winston = require('winston');
const { createLogger, format, transports } = require('winston');
var config = require('../configurations/envconfig.js');
var loggerLevel = process.env.LOGGERLEVEL || config.get('LOGGERLEVEL');
var logger = winston.createLogger({
format: format.combine(
format.timestamp({
format: 'YYYY-MM-DD HH:mm:ss'
}),
format.printf(info => `${info.timestamp} ${info.level}: ${info.message}`+(info.splat!==undefined?`${info.splat}`:" "))
),
transports: [
new (winston.transports.Console)({ level: loggerLevel }),
]
});
module.exports = logger;
logger.info('Message', someObject)
? Birleştirme kullanarak özel bir format kuruyorum ve someObject
günlük mesajına dahil edilemiyorum .
someObject
Aşağıdaki printf ifadesini kullanarak dahil edildim ${info.timestamp} [${info.level.toUpperCase()}]: ${info.message} ${JSON.stringify(info)}
. Silebileceğimi tahmin ettiğim seviye, zaman damgası ve mesajı içerir.
Sen yerleşik kullanabilirsiniz util ve sonsuza sizin nodejs sunucu için timestap ile günlüğü elde etmek. Bir sunucuyu başlattığınızda, parametrenin bir parçası olarak günlük çıktısı ekleyin:
forever start -ao log/out.log server.js
Ve sonra, server.js'nizde util yazabilirsiniz.
server.js
var util = require('util');
util.log("something with timestamp");
Çıktı, out.log dosyasına şunun gibi görünecektir:
out.log
15 Mar 15:09:28 - something with timestamp
util.error()
çıktının zaman damgasını atlar.
Winston'ın farkında olmasam da, bu bir öneri. Günlük kaydı için log4js kullanıyorum ve günlüklerim varsayılan olarak şöyle görünüyor
[2012-04-23 16:36:02.965] [INFO] Development - Node Application is running on port 8090
[2012-04-23 16:36:02.966] [FATAL] Development - Connection Terminated to '127.0.0.1' '6379'
Geliştirme, düğüm sürecimin ortamıdır ve [BİLGİ | FATAL] günlük seviyesidir
Log4js'de günlük kaydı için farklı profillerin korunması mümkündür. Geliştirme ve Üretim profillerim var. Ayrıca, dosya ekleyici, konsol ekleyici vb. Gibi günlük kaydedici türleri de vardır. Eklenti olarak günlük dosyalarınız, günlük düzeyine göre renkli olacaktır [İzleme, Bilgi, Hata Ayıklama, Hata, Ölümcül];)
log4js, console.log'unuzu geçersiz kılar Bu, artık 0.5+ olarak yapılandırılabilir bir parametredir
mevcut konsola zaman damgası ve günlük düzeyi eklemek için konsol damgası kullanabiliriz: require('console-stamp')(console, '[yyyy-mm-dd HH:MM:ss.l]')
Ayrıntılar için https://github.com/starak/node-console-stamp adresine bakın
Bazen varsayılan zaman damgası biçimi sizin için uygun olmayabilir. Uygulamanızla bunu geçersiz kılabilirsiniz.
Onun yerine
var winston = require('winston');
var logger = new (winston.Logger)({
transports: [
new (winston.transports.Console)({'timestamp':true})
]
});
Yazabilirsin
var winston = require('winston');
var logger = new (winston.Logger)({
transports: [
new (winston.transports.Console)({
'timestamp': function() {
return <write your custom formatted date here>;
}
})
]
});
Ayrıntılar için https://github.com/winstonjs/winston#custom-log-format adresine bakın
Biswadev'in cevabını aldım ve telli bir JSON nesnesi oluşturdum. Bu şekilde, günlükleri daha sonra işlemem gerekirse, iyi yapılandırılmış bir biçimde olacaktır.
const winston = require('winston');
const { createLogger, format, transports } = require('winston');
const dotenv = require('dotenv');
dotenv.config();
var logger = createLogger({
level: 'info',
format: format.combine(
format.timestamp({
format: 'YYYY-MM-DD HH:mm:ss',
}),
format.printf((info) =>
JSON.stringify({
t: info.timestamp,
l: info.level,
m: info.message,
s: info.splat !== undefined ? `${info.splat}` : '',
}) + ','
)
),
});
if (process.env.NODE_ENV !== 'PRODUCTION') {
logger.add(new transports.Console({ format: winston.format.cli() }));
// Turn these on to create logs as if it were production
// logger.add(new transports.File({ filename: 'log/output/error.log', level: 'error' }));
// logger.add(new transports.File({ filename: 'log/output/warn.log', level: 'warn' }));
// logger.add(new transports.File({ filename: 'log/output/info.log', level: 'info' }));
} else {
logger.add(new transports.File({ filename: 'log/output/error.log', level: 'error' }));
logger.add(new transports.File({ filename: 'log/output/warn.log', level: 'warn' }));
logger.add(new transports.File({ filename: 'log/output/info.log', level: 'info' }));
}
module.exports = {
logger,
};
Kullanım:
app.listen(port, () => logger.info(`app is running on port ${port}`));
Çıktı:
info.log dosyası:
{"t":"2020-08-06 08:02:05","l":"info","m":"app is running on port 3001","s":""},
Konsol:
info: app is running on port 3001
Diğer bir çözüm, logger'ı logger.info (), logger.error (), vb. Gibi bazı fonksiyonları dışa aktaran bir dosyaya sarmaktır, ardından her mesaj günlüğüne gönderilecek ekstra bir anahtar iletirsiniz.
loggerService.js
const logger = winston.createLogger({ ... })
function handleLog(message, level) {
const logData = {
timestamp: Date.now(),
message,
}
return logger[level](logData)
}
function info(message) {
handleLog(message, 'info')
}
function error(message) {
handleLog(message, 'error')
}
function warn(message) {
handleLog(message, 'warn')
}
module.exports = {
info,
error,
warn
}
ne olursa olsun-file.js
const logger = require('./services/loggerService')
logger.info('Hello World!')
günlüğünüz.log
{"timestamp":"2019-08-21 06:42:27","message":"Hello World!","level":"info"}