web-dev-qa-db-ja.com

Node.jsライブラリWinstonを使用してログにタイムスタンプを追加するにはどうすればよいですか?

ログにタイムスタンプを追加したい。これを達成する最良の方法は何ですか?

82
kolrie

私も同じ問題に自分で対処していました。これを行うことができた方法は2つあります。

Winstonを含めると、通常はデフォルトでコンソールトランスポートが追加されます。このデフォルトのケースでタイムスタンプを取得するには、次のいずれかが必要でした:

  1. コンソールトランスポートを削除し、タイムスタンプオプションを使用して再度追加します。
  2. タイムスタンプオプションをtrueに設定して、独自のLoggerオブジェクトを作成します。

最初:

var winston = require('winston');
winston.remove(winston.transports.Console);
winston.add(winston.transports.Console, {'timestamp':true});

2番目の、よりクリーンなオプション:

var winston = require('winston');
var logger = new (winston.Logger)({
    transports: [
      new (winston.transports.Console)({'timestamp':true})
    ]
});

コンソールトランスポートのその他のオプションのいくつかは here にあります:

  • level:このトランスポートがログに記録するメッセージのレベル(デフォルトは「デバッグ」)。
  • silent:出力を抑制するかどうかを示すブールフラグ(デフォルトはfalse)。
  • colorize:出力を色付けするかどうかを示すブールフラグ(デフォルトはfalse)。
  • timestamp:出力にタイムスタンプを付加するかどうかを示すブールフラグ(デフォルトはfalse)。関数が指定されている場合、タイムスタンプの代わりに戻り値が使用されます。
107
imagreenplant

上記の答えは私にはうまくいきませんでした。最新バージョンのWinston-3.0.0-rc1を使用してログにタイムスタンプを追加しようとしている場合、これは魅力のように機能しました:

    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()」を使用しました。すべてのトランスポートにタイムスタンプが必要なため、各トランスポート内ではなく、createLogger内にフォーマットオプションを追加しました。コンソールとファイル(activity.log)の出力は次のとおりです。

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

通常どおり、「format.combine()」でこのタイムスタンプにフォーマットを追加できます。

format.timestamp({format:'MM-YY-DD'})
41
Siva Kiran

組み込みの til および forever を使用して、nodejsサーバーのタイムスタンプを使用したロギングを実現できます。サーバーを起動するときに、パラメーターの一部としてログ出力を追加します。

forever start -ao log/out.log server.js

そして、あなたはあなたのserver.jsでutilを書くことができます

server.js

var util = require('util');
util.log("something with timestamp");

Out.logファイルの出力は次のようになります。

out.log

15 Mar 15:09:28 - something with timestamp
9
KTU

このようにすることもできます

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

私はウィンストンについては知りませんが、これは提案です。ロギングに log4js を使用し、デフォルトではログは次のようになります

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

開発はノードプロセスの環境であり、[INFO | FATAL]はログレベルです

Log4jsでは、ロギング用のさまざまなプロファイルを維持できます。開発と本番のプロファイルがあります。また、ローリングファイルアペンダー、コンソールアペンダーなどのロガータイプがあります。アドオンとして、ログファイルはログレベル[トレース、情報、デバッグ、エラー、致命的]に基づいてカラフルになります;)

log4jsはconsole.logをオーバーライドします 現在、0.5 +で構成可能なパラメーターです

4
Tamil

console-stampを使用して、既存のコンソールにタイムスタンプとログレベルを追加できます:require('console-stamp')(console, '[yyyy-mm-dd HH:MM:ss.l]')

詳細については、 https://github.com/starak/node-console-stamp を参照してください

2
khoi nguyen

デフォルトのタイムスタンプ形式が便利でない場合があります。実装でオーバーライドできます。

の代わりに

var winston = require('winston');
var logger = new (winston.Logger)({
transports: [
  new (winston.transports.Console)({'timestamp':true})
]
});

あなたは書ける

var winston = require('winston');
var logger = new (winston.Logger)({
transports: [
  new (winston.transports.Console)({
     'timestamp': function() {
        return <write your custom formatted date here>;
     }
  })
]
});

詳細については、 https://github.com/winstonjs/winston#custom-log-format を参照してください

2
walv

別の解決策は、logger.info()、logger.error()などの関数をエクスポートするファイルにロガーをラップすることです。その後、すべてのメッセージログで送信される追加のキーを渡すだけです。

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
}

whatever-file.js

const logger = require('./services/loggerService')

logger.info('Hello World!')

your-log.log

{"timestamp":"2019-08-21 06:42:27","message":"Hello World!","level":"info"}
0
Renan Coelho