Skip to content

Instantly share code, notes, and snippets.

@extJo
Last active April 5, 2018 05:58
Show Gist options
  • Save extJo/cf13394daeebd0ae39ee37c4fc8b9781 to your computer and use it in GitHub Desktop.
Save extJo/cf13394daeebd0ae39ee37c4fc8b9781 to your computer and use it in GitHub Desktop.
지극히 주관적인 node.js 의 logging 전략 (with winston)
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 };
@extJo
Copy link
Author

extJo commented Apr 5, 2018

const { reqInfoLogger, errorLogger } = require('logger의 위치');

reqInfoLogger({req});
형태로 사용

의견남겨주시면 감사합니다

@dev-juyoung
Copy link

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