ログにタイムスタンプを追加したい。これを達成する最良の方法は何ですか?
私も同じ問題に自分で対処していました。これを行うことができた方法は2つあります。
Winstonを含めると、通常はデフォルトでコンソールトランスポートが追加されます。このデフォルトのケースでタイムスタンプを取得するには、次のいずれかが必要でした:
最初:
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 にあります:
上記の答えは私にはうまくいきませんでした。最新バージョンの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'})
組み込みの 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
このようにすることもできます
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;
私はウィンストンについては知りませんが、これは提案です。ロギングに 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 +で構成可能なパラメーターです
console-stampを使用して、既存のコンソールにタイムスタンプとログレベルを追加できます:require('console-stamp')(console, '[yyyy-mm-dd HH:MM:ss.l]')
詳細については、 https://github.com/starak/node-console-stamp を参照してください
デフォルトのタイムスタンプ形式が便利でない場合があります。実装でオーバーライドできます。
の代わりに
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 を参照してください
別の解決策は、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"}