エクスプレス変換をログに記録するためにmorgan
を使用します。
var morgan = require('morgan');
morgan('combined');
// a format string
morgan(':remote-addr :method :url :uuid');
// a custom function
morgan(function (req, res) {
return req.method + ' ' + req.url + ' ' + req.uuid;
})
また、他のログを記録するためにwinston
を使用します。
var winston = require('winston');
var logger = new (winston.Logger)({
transports: [
new (winston.transports.Console)({ level: 'info' }),
new (winston.transports.File)({ filename: '/var/log/log-file.log' })
]
});
2つのロガーを結合する方法はありますか?現在の状況は、morgan
が/var/log/log-file.log
に書き込むときに、winston
が標準出力に書き込まれるということです。
ロガーファイルが高速変換情報と他の必要な情報(logger.info()
)から結合されることを望みます。
この記事は、あなたがやりたいことに対して素晴らしい仕事をします。
http://tostring.it/2014/06/23/advanced-logging-with-nodejs/
特定のコードには、おそらく次のようなものが必要です。
var logger = new winston.Logger({
transports: [
new winston.transports.File({
level: 'info',
filename: './logs/all-logs.log',
handleExceptions: true,
json: true,
maxsize: 5242880, //5MB
maxFiles: 5,
colorize: false
}),
new winston.transports.Console({
level: 'debug',
handleExceptions: true,
json: false,
colorize: true
})
],
exitOnError: false
}),
logger.stream = {
write: function(message, encoding){
logger.info(message);
}
};
app.use(require("morgan")("combined", { "stream": logger.stream }));
これにより、ファイルだけでなくコンソールにもログを書き込むようにWinstonが設定されます。次に、最後の式を使用して、morganミドルウェアからの出力をwinstonに渡すことができます。
TypeScriptの場合:
let logger = new (winston.Logger)({
exitOnError: false,
level: 'info',
transports: [
new (winston.transports.Console)(),
new (winston.transports.File)({ filename: 'app.log'})
]
})
class MyStream {
write(text: string) {
logger.info(text)
}
}
let myStream = new MyStream()
app.use(morgan('tiny', { stream: myStream }));
最後の行を更新して警告を削除します
app.use(require("morgan")("combined", { stream: logger.stream }));
モーガンには\n
でメッセージを終了するという悪い癖があるので、物事を整然とするために、Winstonに書き込む前にそれを削除することができます。
これは、Winstonのフォーマット側など、または\n
を書き込まないようにストリームを更新するなど、さまざまな方法で実行できます。
class MyStream {
write(text: string) {
logger.info(text.replace(/\n$/, '');
}
}
let myStream = new MyStream()
app.use(morgan('tiny', { stream: myStream }));
typeScriptの場合、クラスを作成する必要なく、別の方法でそれを実行できます
let logger = new (winston.Logger)({
exitOnError: false,
level: 'info',
transports: [
new (winston.transports.Console)(),
new (winston.transports.File)({ filename: 'app.log'})
]
})
const myStream = {
write: (text: string) => {
logger.info(text)
}
}
app.use(morgan('combined', { stream: myStream }));
このソリューションは、このGithubページからハイブされました https://github.com/winstonjs/winston/issues/1385 。ただし、コードにはわずかな違いがあることに注意することが重要です。の代わりに:
app.use(morgan('combined', { myStream }));
私が使う:
app.use(morgan('combined', { stream: myStream }));
これは、クラスを作成する上であまり大きくないので助けてくれました。