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


93

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


これは、クライアントマシンからは実行できないため、広範にとどまっています。
ジョシュア

回答:


112

私自身も同じ問題を扱っていました。これを行うには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})
    ]
});

コンソール転送の他のオプションのいくつかはここにあります

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

1
素晴らしいと同時にシンプル。ありがとうございました!
kolrie

7
これは素晴らしい。通常、これを専用ファイルにラップして、構成したロガーを任意のファイルから簡単に取得できるようにします。つまり、上記のコード(オプション2)を新しいファイルlogger.jsに入れ、その後にmodule.exports = logger; 次に、任意のファイルからvar logger = require( './ logger.js')を実行し、任意のファイルからlogger.info( 'hello')を実行して、Winstonの同じ構成を取得できます。
JHH、2015年

TypeError:(中間値)は関数ではありません
Urasquirrel

79

上記の答えは私にはうまくいきませんでした。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'})

14

私たちもこうすることができます

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)ますか?結合を使用してカスタム形式をセットアップしましたsomeObjectが、ログメッセージに含まれているようには見えません。
SomethingOn

1
someObject次のprintfステートメントを使用してインクルードすることができました${info.timestamp} [${info.level.toUpperCase()}]: ${info.message} ${JSON.stringify(info)}。レベル、タイムスタンプ、メッセージが含まれているので、削除できると思います。
SomethingOn

9

組み込みのutilforeverを使用して、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

1
残念ながら、util.error()出力のタイムスタンプをスキップします。
サラン

4

私はウィンストンに気づいていませんが、これは提案です。ロギングに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 +以降の構成可能なパラメーターです。


参考:log4js-nodeの新しいバージョン(0.5以降)は、console.logを自動的に上書きしません。
ジェフヒルツ2012

@jeffhiltz Ya正解です:)これは設定可能なパラメータです
タミル語

2

時々、デフォルトのタイムスタンプ形式は都合が悪い場合があります。これを実装でオーバーライドできます。

の代わりに

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を参照してください



0

別の解決策は、ロガーを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

Biswadevの答えを受け取り、文字列化されたJSONオブジェクトを作成しました。この方法で、後でログを処理する必要がある場合、適切に構造化された形式になります。

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,
};

使用法:

app.listen(port, () => logger.info(`app is running on port ${port}`));

出力:

info.logファイル:

{"t":"2020-08-06 08:02:05","l":"info","m":"app is running on port 3001","s":""},

コンソール:

info:    app is running on port 3001
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.