Skip to content

Instantly share code, notes, and snippets.

@radavis
Created November 6, 2020 22:05
Show Gist options
  • Save radavis/e513ba1686708bb803ea2bf4a2c361db to your computer and use it in GitHub Desktop.
Save radavis/e513ba1686708bb803ea2bf4a2c361db to your computer and use it in GitHub Desktop.
Morgan, Winston configuration for Express
const winston = require('winston')
const morgan = require('morgan')
const { name: packageName } = require('./package')
const {
LOG_CONSOLE,
LOG_FILE,
LOG_LEVEL,
NODE_ENV
} = process.env
const format = winston.format.combine(
winston.format.timestamp(),
winston.format.errors({ stack: true }),
NODE_ENV !== 'production' ? winston.format.simple() : winston.format.json()
)
const transports = [
LOG_CONSOLE === 'true' && new winston.transports.Console(),
LOG_FILE === 'true' && new winston.transports.File({ filename: `${packageName}.log` })
].filter(Boolean)
const logger = winston.createLogger({
defaultMeta: { service: packageName },
format,
level: LOG_LEVEL,
transports
})
// write morgan http request data as json to winston logs
logger.stream = {
write: (json) => {
const requestData = JSON.parse(json);
const message = `${requestData.method} ${requestData.url} ${requestData.status}`
logger.log('info', {
...requestData,
message
})
}
}
// https://www.npmjs.com/package/morgan#tokens
morgan.token('id', req => req.id)
morgan.token('uid', req => req.user && req.user.id)
const tokenString = [
'id',
'http-version',
'method',
'remote-addr',
'status',
'total-time',
'uid',
'url',
// 'response-time',
// 'user-agent',
].map(token => `"${token}": ":${token}"`)
.join(', ');
const morganFormat = `{${tokenString}, "content-length": ":res[content-length]"}`
const requestLoggerMiddleware = morgan(morganFormat, { stream: logger.stream });
module.exports = {
logger,
requestLoggerMiddleware
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment