2017-10-06 4 views
0

Je voudrais utiliser winston dans mon application express.Ajouter winston pour exprimer l'application

J'ai configuré winston comme ce qui suit:

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(), 
    }) 
} 

Dans mon application express Je veux ajouter winston comme middleware pour connecter la console:

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) 
}) 

Mon problème est que mon application ne pas charger et me renvoie le message d'erreur suivant:

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) 

Toute suggestion que je je fais mal?

J'apprécie vos réponses!

Répondre

1

Votre module exporte une fonction qui configure winston. Cette fonction est transmis à Express:

app.use(winston) 

Ainsi, pour chaque demande, cette fonction est appelée, ce qui signifie que chaque fois que la configuration est exécutée winston, ajoutant à la fois les Console et les File transports.

Pour une raison quelconque, vous supprimez le premier transport Console, ce qui ne déclenche pas une erreur, mais lorsque le transport File est ajouté (encore une fois, et encore, etc), vous obtiendrez l'erreur: "Transport déjà attaché: fichier, attribuez un nom différent" (en d'autres termes: vous avez déjà un transport File attaché à l'enregistreur, et vous ne pouvez en ajouter qu'un autre si vous changez son nom explicitement).

Le problème principal ici est que la fonction exportée n'est pas une fonction de middleware Express, donc vous ne pouvez pas la passer à app.use() et attendez qu'elle fonctionne correctement.

Si votre intention est de consigner les requêtes HTTP avec winston, vous devez utiliser un module de middleware approprié tel que express-winston.