Last active
April 5, 2018 05:58
-
-
Save extJo/cf13394daeebd0ae39ee37c4fc8b9781 to your computer and use it in GitHub Desktop.
지극히 주관적인 node.js 의 logging 전략 (with winston)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const DailyRotateFile = require('winston-daily-rotate-file'); | |
const moment = require('moment'); | |
const fs = require('fs'); | |
const { createLogger, format, transports } = require('winston'); | |
const { | |
printf, combine, timestamp, prettyPrint, | |
} = format; | |
const logDir = 'logs'; | |
moment.locale('ko'); | |
const timeStampFormat = () => moment().format('HH:mm:ss.SSS ZZ'); | |
if (!fs.existsSync(logDir)) { | |
fs.mkdirSync(logDir); | |
} | |
const myFormat = printf((info) => { | |
const { level, message } = info; | |
const { req, err } = message; | |
let log = { | |
time: timeStampFormat(), level, | |
}; | |
switch (level) { | |
case 'info': | |
log = { | |
...log, | |
method: req.method, | |
router: req.originalUrl, | |
ip: req.ip, | |
userAgent: req.headers['user-agent'], | |
token: req.headers['x-access-token'], | |
param: req.params, | |
query: req.query, | |
body: req.body, | |
}; | |
break; | |
case 'error': | |
log = { | |
method: req.method, | |
router: req.originalUrl, | |
ip: req.ip, | |
userAgent: req.headers['user-agent'], | |
token: req.headers['x-access-token'], | |
err, | |
}; | |
break; | |
default: | |
log = { ...log, ...message }; | |
} | |
return JSON.stringify(log, null, '\t'); | |
}); | |
const requestInfoLogger = (message) => { | |
const logger = createLogger({ | |
level: 'info', | |
format: myFormat, | |
transports: [ | |
new transports.Console({ | |
name: 'debug-console', | |
colorize: true, | |
showLevel: true, | |
timestamp: timeStampFormat, | |
}), | |
new DailyRotateFile({ | |
name: 'info-log', | |
filename: 'logs/info-%DATE%.log', | |
showLevel: true, | |
zippedArchive: true, | |
maxSize: '25m', | |
maxFiles: '14d', | |
}), | |
], | |
}); | |
return logger.info(message); | |
}; | |
const errorLogger = (message) => { | |
const logger = createLogger({ | |
level: 'error', | |
format: myFormat, | |
transports: [ | |
new transports.Console({ | |
name: 'debug-console', | |
colorize: true, | |
showLevel: true, | |
timestamp: timeStampFormat, | |
}), | |
new DailyRotateFile({ | |
name: 'info-log', | |
filename: 'logs/error-%DATE%.log', | |
showLevel: true, | |
zippedArchive: true, | |
maxSize: '25m', | |
maxFiles: '14d', | |
}), | |
], | |
}); | |
return logger.error(message); | |
}; | |
const exceptionLogger = createLogger({ | |
level: 'error', | |
format: combine( | |
timestamp(), | |
prettyPrint(), | |
), | |
exceptionHandlers: [ | |
new transports.Console({ | |
name: 'debug-console', | |
colorize: true, | |
showLevel: true, | |
timestamp: timeStampFormat, | |
}), | |
new DailyRotateFile({ | |
name: 'error-log', | |
filename: 'logs/exception-%DATE%.log', | |
showLevel: true, | |
zippedArchive: true, | |
maxSize: '25m', | |
maxFiles: '14d', | |
}), | |
], | |
}); | |
module.exports = { requestInfoLogger, errorLogger }; |
const { requestInfoLogger, errorLogger } = require('path/to/logger');
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
const { reqInfoLogger, errorLogger } = require('logger의 위치');
reqInfoLogger({req});
형태로 사용
의견남겨주시면 감사합니다