Skip to content

Commit

Permalink
feat: add metadata for logs (#280)
Browse files Browse the repository at this point in the history
  • Loading branch information
fruneen committed Feb 21, 2024
1 parent 8cee224 commit b2d501c
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 23 deletions.
12 changes: 9 additions & 3 deletions template/apps/api/src/app.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import cors from '@koa/cors';
import bodyParser from 'koa-bodyparser';
import helmet from 'koa-helmet';
import qs from 'koa-qs';
import requestLogger from 'koa-logger';
import koaLogger from 'koa-logger';

import { AppKoa } from 'types';

Expand Down Expand Up @@ -41,7 +41,13 @@ const initKoa = () => {
ctx.throw(422, 'Unable to parse request JSON.');
},
}));
app.use(requestLogger());
app.use(koaLogger({
transporter: (message, args) => {
const [, method, endpoint, status, time, length] = args;

logger.http(message.trim(), { method, endpoint, status, time, length });
},
}));

routes(app);

Expand All @@ -66,7 +72,7 @@ const app = initKoa();
await Promise.all(connections);

server.listen(config.PORT, () => {
logger.info(`API server is listening on ${config.PORT}, in ${config.APP_ENV} environment`);
logger.info(`API server is listening on ${config.PORT} in ${config.APP_ENV} environment`);
});
})();

Expand Down
34 changes: 15 additions & 19 deletions template/apps/api/src/logger.ts
Original file line number Diff line number Diff line change
@@ -1,19 +1,24 @@
import _ from 'lodash';
import winston from 'winston';

import config from 'config';

const formatToPrettyJson = winston.format.printf(info => {
if (typeof info.message.constructor === 'object' || typeof info.message.constructor === 'function') {
info.message = JSON.stringify(info.message, null, 4);
const formatToPrettyJson = winston.format.printf(({ level, message }) => {
if (_.isPlainObject(message)) {
message = JSON.stringify(message, null, 4);
}

return `${info.level}: ${info.message}`;
return `${level}: ${message}`;
});

const getFormat = (isDev: boolean) => {
if (isDev) {
return winston.format.combine(
winston.format.colorize(),
winston.format.colorize({
colors: {
http: 'cyan',
},
}),
winston.format.splat(),
winston.format.simple(),
formatToPrettyJson,
Expand All @@ -23,35 +28,26 @@ const getFormat = (isDev: boolean) => {
return winston.format.combine(
winston.format.errors({ stack: true }),
winston.format.timestamp(),
winston.format.splat(),
winston.format.json(),
);
};

const createConsoleLogger = (isDev: boolean) => {
const createConsoleLogger = (isDev = false) => {
const transports: winston.transport[] = [
new winston.transports.Console({
level: isDev ? 'debug' : 'info',
stderrLevels: [
'emerg',
'alert',
'crit',
'error',
],
level: isDev ? 'debug' : 'verbose',
}),
];

const logger = winston.createLogger({
return winston.createLogger({
exitOnError: false,
transports,
format: getFormat(isDev),
});

logger.debug('[Logger] Configured console based logger');

return logger;
};

const consoleLogger = createConsoleLogger(config.IS_DEV);
const consoleLogger = createConsoleLogger(config?.IS_DEV ?? process.env.APP_ENV === 'development');

global.logger = consoleLogger;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
import { AppKoaContext, Next, ValidationErrors } from 'types';

import { userService } from 'resources/user';

import logger from 'logger';
import config from 'config';

interface CustomError extends Error {
status?: number;
Expand All @@ -18,7 +21,18 @@ const routeErrorHandler = async (ctx: AppKoaContext, next: Next) => {
const serverError = { global: typedError.message || 'Unknown error' };

const errors = clientError || serverError;
logger.error(errors);

let loggerMetadata = {};

if (!config.IS_DEV) {
loggerMetadata = {
requestBody: ctx.request.body,
requestQuery: ctx.request.query,
user: userService.getPublic(ctx.state.user),
};
}

logger.error(JSON.stringify(errors, null, 4), loggerMetadata);

if (serverError && process.env.APP_ENV === 'production') {
serverError.global = 'Something went wrong';
Expand Down

0 comments on commit b2d501c

Please sign in to comment.