Skip to content

Commit

Permalink
Introduce winston logger to replace the console logs
Browse files Browse the repository at this point in the history
  • Loading branch information
kabirbaidhya committed Aug 8, 2016
1 parent 65efe97 commit c9fa283
Show file tree
Hide file tree
Showing 7 changed files with 41 additions and 22 deletions.
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
"lodash.debounce": "^4.0.6",
"lodash.throttle": "^4.0.1",
"pg": "^6.0.1",
"winston": "^2.2.0",
"yamljs": "^0.2.8"
},
"devDependencies": {
Expand Down
13 changes: 7 additions & 6 deletions src/Listener.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import {yellow, green, red, dim} from 'chalk';

import {halt} from './program';
import {log, error} from './util';
import logger from './logging/logger';
import * as msg from './messages/common';

class Listener {
Expand All @@ -28,10 +29,10 @@ class Listener {
halt(err);
}

log(msg.DATABASE_CONNECTED, yellow(connection.database));
logger.info(msg.DATABASE_CONNECTED, yellow(connection.database));
});

client.on('notice', msg => log(msg));
client.on('notice', msg => logger.info(msg));
client.on('notification', notification => this.handle(notification));

channels.forEach(channel => this.listenTo(channel));
Expand All @@ -56,7 +57,7 @@ class Listener {
const handlers = this.handlers[channel];

if (!Array.isArray(handlers)) {
throw new Error(format(msg.NO_HANDLERS_FOUND, channel));
throw new Error(format(msg.WARN_NO_HANDLERS_FOUND, channel));
}

// TODO: Delegate CPU-intensive jobs to a task queue or a separate process.
Expand All @@ -68,7 +69,7 @@ class Listener {
const database = this.client.database;
const {channel, payload: str} = notification;

log(msg.RECEIVED_NOTIFICATION, green(database + ':' + channel), dim(str || '(empty)'));
logger.info(msg.RECEIVED_NOTIFICATION, green(database + ':' + channel), dim(str || '(empty)'));

try {
const payload = this.parsePayload(str);
Expand All @@ -84,11 +85,11 @@ class Listener {
const database = this.client.database;

this.client.query(`LISTEN ${channel}`).then(() => {
log(msg.STARTED_LISTENING, green(database + ':' + channel));
logger.info(msg.STARTED_LISTENING, green(database + ':' + channel));

// Warn if handlers are not registered for the channels being listened to
if (!Array.isArray(this.handlers[channel])) {
error(format(msg.NO_HANDLERS_FOUND, channel));
logger.warn(msg.WARN_NO_HANDLERS_FOUND, channel);
}
});
}
Expand Down
14 changes: 14 additions & 0 deletions src/logging/logger.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import winston from 'winston';

const formatter = (opts) => {
return `[${opts.level}] ${(opts.message || '')}` +
(opts.meta && Object.keys(opts.meta).length ? '\n\t' + JSON.stringify(opts.meta) : '' );
};

const logger = new (winston.Logger)({
transports: [
new winston.transports.Console({formatter})
]
});

export default logger;
6 changes: 3 additions & 3 deletions src/messages/common.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
export const NO_HANDLERS_FOUND = 'Warning: No handlers are registered for channel "%s" yet.';
export const WARN_NO_HANDLERS_FOUND = 'Warning: No handlers are registered for channel "%s" yet.';
export const NO_CHANNELS_TO_LISTEN = 'No channels to LISTEN to';
export const RECEIVED_NOTIFICATION = 'Received notification on channel %s: %s';
export const DATABASE_CONNECTED = 'Connected to database %s';
export const STARTED_LISTENING = 'Started listening to channel %s';
export const SETUP_ERROR = 'Setup could not be completed.';
export const GENERIC_ERROR_MESSAGE = 'An error occurred.';
export const LOADED_CONFIG_FILE = 'Loaded configuration file: %s';
export const ERROR_LOADING_CONFIG_FILE = 'Error loading configuration file: %s';
export const LOADED_CONFIG_FILE = 'Loaded configuration file %s';
export const ERROR_LOADING_CONFIG_FILE = 'Error loading configuration file %s';
export const NO_CONNECTIONS_CONFIGURED = 'No database connections are configured. Please do configure properly and start pglistend again.';
5 changes: 3 additions & 2 deletions src/program.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@ import prog from 'commander';
import {spawnSync} from 'child_process';

import Listener from './Listener';
import {error} from './util';
import {error, isString} from './util';
import logger from './logging/logger';
import * as msg from './messages/common';
import {resolveConfig, resolveHandlers} from './resolver';

Expand Down Expand Up @@ -36,7 +37,7 @@ export function run() {
* Note: Should be called only in case of fatal error.
*/
export function halt(err) {
error(err || msg.GENERIC_ERROR_MESSAGE);
logger.error(isString(err) ? err : (err.message || msg.GENERIC_ERROR_MESSAGE));
process.exit(1);
}

Expand Down
7 changes: 4 additions & 3 deletions src/query.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import {log, error} from './util';
import logger from './logging/logger';

/**
* @return {Promise}
Expand All @@ -10,7 +11,7 @@ export default function query(sql, values) {
let message = `Connection Error: ${err}`;

reject(message);
error(message);
logger.error(message);

return;
}
Expand All @@ -22,12 +23,12 @@ export default function query(sql, values) {
let message = `Query error: ${err}`;

reject(message);
error(message);
logger.error(message);

return;
}

log('Executed query: ', sql);
logger.info('Executed query: ', sql);
resolve(result);
});
});
Expand Down
17 changes: 9 additions & 8 deletions src/resolver.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@ import {yellow} from 'chalk';
import deepAssign from 'deep-assign';

import query from './query';
import {log, error} from './util';
import {throttle, debounce} from './util';
import {isObject, isFunction} from './util';
import * as msg from './messages/common';
import logger from './logging/logger';

export function resolveConfig(file) {
let config = loadConfig(file);
Expand All @@ -27,10 +27,10 @@ function loadConfig(file) {
try {
let config = Yaml.load(file);

log(msg.LOADED_CONFIG_FILE, yellow(file));
logger.info(msg.LOADED_CONFIG_FILE, yellow(file));
return config;
} catch (e) {
error(msg.ERROR_LOADING_CONFIG_FILE, file);
logger.error(msg.ERROR_LOADING_CONFIG_FILE, file);
throw e;
}
}
Expand All @@ -39,7 +39,7 @@ export function resolveHandlers(config) {
let scripts = Array.isArray(config.scripts) ? config.scripts : [];

if (scripts.length === 0) {
error('Warning: No listener scripts are configured.');
logger.warn('No listener scripts are configured.');

return {};
}
Expand All @@ -56,7 +56,8 @@ function getCallbackHelpers(config) {
let pool = new Pool(config.connection);

return {
log, error,
log: logger.info,
error: logger.error,
throttle, debounce,
query: query.bind(pool)
};
Expand All @@ -65,7 +66,7 @@ function getCallbackHelpers(config) {
function resolveHandlersFromFile(file, helpers) {
let func = require(file);

if (!isFunction(require(file))) {
if (!isFunction(func)) {
throw new Error(`Invalid listener script provided. The script file "${file}" should export a function.`);
}

Expand All @@ -89,7 +90,7 @@ function resolveForScripts(scripts, helpers) {
let callback = handlers[key];

if (!isFunction(callback)) {
error(`Invalid callback function specified for key "${key}" on file "${file}"`);
logger.error(`Invalid callback function specified for key "${key}" on file "${file}"`);

continue;
}
Expand All @@ -101,7 +102,7 @@ function resolveForScripts(scripts, helpers) {
resolved[key].push(callback);
}
} catch (e) {
error(e.message);
logger.error(e.message);
}
});

Expand Down

0 comments on commit c9fa283

Please sign in to comment.