简体   繁体   English

将Winston添加到Express应用

[英]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设置时,都会同时添加ConsoleFile传输。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM