[英]Adding winston to express app
I would like to use winston in my express app. 我想在我的Express应用中使用Winston 。
I have configured winston like the following: 我已将Winston配置如下:
const path = require('path')
const winston = require('winston')
module.exports = () => {
process.on('uncaughtException', err => winston.error('uncaught exception: ', err))
process.on('unhandledRejection', (reason, p) => winston.error('unhandled rejection: ', reason, p))
winston.emitErrs = true
winston.exitOnError = false
winston.level = process.env.NODE_ENV === 'production' ? 'info' : 'debug'
winston.remove(winston.transports.Console)
winston.add(winston.transports.Console, {
level: process.env.NODE_ENV === 'production' ? 'info' : 'debug',
handleExceptions: true,
prettyPrint: true,
humanReadableUnhandledException: false,
json: false,
colorize: true,
timestamp: new Date(),
})
winston.add(winston.transports.File, {
level: 'info',
filename: path.join(__dirname, '../logs/app.log'),
handleExceptions: true,
humanReadableUnhandledException: true,
json: false,
maxsize: 10242880, // ~10MB
maxFiles: 3,
colorize: false,
timestamp: new Date(),
})
}
In my express app I want to add winston as a middleware to log the console: 在我的快速应用程序中,我想添加winston作为中间件来记录控制台:
const express = require('express')
const winston = require("./config/winston")
const app = express()
//initialize winston
app.use(winston)
app.get('/', function (req, res) {
res.send('Hello World!')
})
//Start Server
const port = process.env.APP_PORT || 3000
const host = process.env.APP_HOST || "localhost"
app.listen(port, function() {
console.log("Listening on " + host + ":" + port)
})
My problem is that my app does not load and gives me back the following error message: 我的问题是我的应用程序无法加载,并给我以下错误消息:
Error: Transport already attached: file, assign a different name
at exports.Logger.Logger.add (C:\Users\user\Desktop\Coding Projects\learning_npm_winston\node_modules\winston\lib\winst
on\logger.js:487:11)
at Object.winston.(anonymous function) [as add] (C:\Users\user\Desktop\Coding Projects\learning_npm_winston\node_module
s\winston\lib\winston.js:86:34)
at module.exports (C:\Users\user\Desktop\Coding Projects\learning_npm_winston\src\t02-loggingToFolder.js:23:11)
at Layer.handle [as handle_request] (C:\Users\user\Desktop\Coding Projects\learning_npm_winston\node_modules\express\li
b\router\layer.js:95:5)
at trim_prefix (C:\Users\user\Desktop\Coding Projects\learning_npm_winston\node_modules\express\lib\router\index.js:317
:13)
at C:\Users\user\Desktop\Coding Projects\learning_npm_winston\node_modules\express\lib\router\index.js:284:7
at Function.process_params (C:\Users\user\Desktop\Coding Projects\learning_npm_winston\node_modules\express\lib\router\
index.js:335:12)
at next (C:\Users\user\Desktop\Coding Projects\learning_npm_winston\node_modules\express\lib\router\index.js:275:10)
at expressInit (C:\Users\user\Desktop\Coding Projects\learning_npm_winston\node_modules\express\lib\middleware\init.js:
40:5)
at Layer.handle [as handle_request] (C:\Users\user\Desktop\Coding Projects\learning_npm_winston\node_modules\express\li
b\router\layer.js:95:5)
Any suggestion what I am doing wrong? 有什么建议我做错了吗?
I appreciate your replies! 感谢您的答复!
Your module exports a function that sets up winston. 您的模块将导出设置Winston的函数。 That function gets passed to Express:
该函数被传递给Express:
app.use(winston)
So for every request, that function gets called, which means that each time the winston setup is executed, adding both the Console
and the File
transports. 因此,对于每个请求,都会调用该函数,这意味着每次执行Winston设置时,都会同时添加
Console
和File
传输。
For some reason, you're removing the Console
transport first, so that doesn't trigger an error, but when the File
transport is added (again, and again, etc), you'll get the error: "Transport already attached: file, assign a different name" (in other words: you already have a File
transport attached to the logger, and you can only add another one if you change its name explicitly). 出于某种原因,您首先要删除
Console
传输,因此不会触发错误,但是在添加File
传输时(再次,等等),您将收到错误消息: “传输已附加:文件,请分配一个不同的名称” (换句话说:您已经在记录器上附加了File
传输,并且仅在显式更改其名称的情况下才能添加另一个)。
The main problem here is that the exported function isn't an Express middleware function, so you can't pass it to app.use()
and expect it to work properly. 这里的主要问题是,导出的函数不是Express中间件函数,因此您不能将其传递给
app.use()
并期望其正常运行。
If your intention is to log HTTP requests with winston, you should use a proper middleware module like express-winston
. 如果您打算使用Winston记录HTTP请求,则应使用适当的中间件模块,例如
express-winston
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.