Winston Node.js kitaplığını kullanarak günlüklere nasıl zaman damgası ekleyebilirim?


94

Günlüklere zaman damgası eklemek istiyorum. Bunu başarmanın en iyi yolu nedir?


Bu çok geniş kalır çünkü bunu istemci makineden YAPAMAZSINIZ.
Joshua

Yanıtlar:


113

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:

  1. Konsol aktarımını kaldırın ve zaman damgası seçeneğiyle tekrar ekleyin.
  2. Zaman damgası seçeneği true olarak ayarlanmış olarak kendi Logger nesnenizi oluşturun.

İ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 :

  • düzey: Bu aktarımın günlüğe kaydetmesi gereken ileti düzeyi (varsayılan 'hata ayıklama').
  • sessiz: Çıktının bastırılıp kaldırılmayacağını belirten Boole bayrağı (varsayılan yanlış).
  • colorize: Çıktıyı renklendirip renklendirmemiz gerektiğini belirten Boole bayrağı (varsayılan yanlış).
  • zaman damgası: Çıktının başına zaman damgaları ekleyip eklemememiz gerektiğini belirten Boole bayrağı (varsayılan yanlış). İşlev belirtilmişse, zaman damgaları yerine dönüş değeri kullanılacaktır.

1
Şaşırtıcı ve aynı zamanda basit. Teşekkür ederim!
kolrie

7
Bu harika. Yapılandırılmış günlükçümü herhangi bir dosyadan kolayca alabilmek için genellikle bunu özel bir dosyaya sararım, yani yukarıdaki kodu (seçenek 2) yeni bir logger.js dosyasına, ardından module.exports = logger; daha sonra herhangi bir dosyadan var logger = require ('./ logger.js') yapıyorum ve daha sonra herhangi bir dosyadan logger.info ('merhaba') yapabilir ve Winston'ın aynı konfigürasyonunu alabilirim.
JHH

TypeError: (ara değer) bir işlev değil
Urasquirrel

85

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

17

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;

Bu da işe yarar mı logger.info('Message', someObject)? Birleştirme kullanarak özel bir format kuruyorum ve someObjectgünlük mesajına dahil edilemiyorum .
SomethingOn

1
someObjectAş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.
SomethingOn

9

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

1
Maalesef util.error()çıktının zaman damgasını atlar.
Saran

4

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


Bilginize: log4js-node'un (0.5+) daha yeni sürümleri, console.log'u otomatik olarak geçersiz kılmaz.
Jeff Hiltz

@jeffhiltz Ya haklısın :) Şimdi bu yapılandırılabilir bir parametre
Tamil


2

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


2

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

1
bunu seviyorum ... kopyala yapıştır çözüm !!
Bay P

1

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"}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.