typescript-express-starter
Version:
Quick and Easy TypeScript Express Starter
78 lines (68 loc) • 2.01 kB
text/typescript
import { existsSync, mkdirSync } from 'fs';
import { join } from 'path';
import winston from 'winston';
import winstonDaily from 'winston-daily-rotate-file';
import { LOG_DIR } from '@config';
import { HttpException } from '@exceptions/httpException';
// logs dir
const logDir: string = join(__dirname, LOG_DIR);
if (!existsSync(logDir)) {
mkdirSync(logDir);
}
// Define log format
const logFormat = winston.format.printf(({ timestamp, level, message }) => `${timestamp} ${level}: ${message}`);
/*
* Log Level
* error: 0, warn: 1, info: 2, http: 3, verbose: 4, debug: 5, silly: 6
*/
export const logger = winston.createLogger({
format: winston.format.combine(
winston.format.timestamp({
format: 'YYYY-MM-DD HH:mm:ss',
}),
logFormat,
),
transports: [
// debug log setting
new winstonDaily({
level: 'debug',
datePattern: 'YYYY-MM-DD',
dirname: logDir + '/debug', // log file /logs/debug/*.log in save
filename: `%DATE%.log`,
maxFiles: 30, // 30 Days saved
json: false,
zippedArchive: true,
}),
// error log setting
new winstonDaily({
level: 'error',
datePattern: 'YYYY-MM-DD',
dirname: logDir + '/error', // log file /logs/error/*.log in save
filename: `%DATE%.log`,
maxFiles: 30, // 30 Days saved
handleExceptions: true,
json: false,
zippedArchive: true,
}),
],
});
logger.add(
new winston.transports.Console({
format: winston.format.combine(winston.format.splat(), winston.format.colorize()),
}),
);
export const responseLogger = request => {
const { query } = request.request;
logger.info(query);
};
export const errorLogger = error => {
const { validationErrors } = error.extensions.exception;
let message = '';
if (validationErrors) {
message = validationErrors.map(error => Object.values(error.constraints)).join(', ');
} else {
message = error.message;
}
logger.error(message);
throw new HttpException(400, message);
};