Skip to content

Commit ff53550

Browse files
v0vsnir0s
authored andcommitted
REFACTOR: Improve logger interface, add eslint
1. Add eslint based on airbnb base rules 2. Change logger interface to receive configuration object instead of variables 3. Add option to provide skip function for setupExpressLogger 4. Upgrade node image in circleci config
1 parent 04ef748 commit ff53550

File tree

7 files changed

+60
-23
lines changed

7 files changed

+60
-23
lines changed

.circleci/config.yml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ version: 2
22
jobs:
33
build:
44
docker:
5-
- image: circleci/node:10.9.0
5+
- image: circleci/node:12.15.0
66

77
working_directory: ~/repo
88

@@ -25,6 +25,8 @@ jobs:
2525

2626
- run: npm install
2727

28+
- run: npm run lint
29+
2830
- run: npm run test
2931

3032
- save_cache:

.eslintignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
**/*.ts
2+
node_modules/

.eslintrc.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
module.exports = {
2+
env: {
3+
es6: true,
4+
node: true,
5+
mocha: true
6+
},
7+
extends: 'airbnb-base',
8+
globals: {
9+
Atomics: 'readonly',
10+
SharedArrayBuffer: 'readonly',
11+
},
12+
parserOptions: {
13+
ecmaVersion: 2018,
14+
sourceType: 'module',
15+
}
16+
};

index.d.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,19 @@
11
import { Logger } from 'winston';
22
import { Handler } from 'express';
3+
import { RouteFilter } from 'express-winston';
34

45
declare namespace strigoNodeLogger {
5-
function setupNodeLogger(env: string, level?: string): Logger;
6-
function setupExpressLogger(env: string, level?: string): { logger: Logger, loggerMiddleware: Handler };
6+
type NodeLoggerOptions = {
7+
env?: string;
8+
level?: string;
9+
}
10+
11+
type NodeExpressLoggerOptions = NodeLoggerOptions & {
12+
skip?: RouteFilter[]
13+
}
14+
15+
function setupNodeLogger(loggerOptions: NodeLoggerOptions): Logger;
16+
function setupExpressLogger(loggerOptions: NodeExpressLoggerOptions): { logger: Logger, loggerMiddleware: Handler };
717
}
818

919
export = strigoNodeLogger;

index.js

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -45,35 +45,39 @@ function configureFormatters(env) {
4545
* @param {String} env The name of the environment to use. This affects formatting.
4646
* @param {String} level The level to use when setting the logger up.
4747
*/
48-
function setupNodeLogger(env, level = DEFAULT_LOG_LEVEL) {
48+
function setupNodeLogger({ env = '', level = DEFAULT_LOG_LEVEL }) {
4949
return createLogger({
5050
level,
5151
format: format.combine(...configureFormatters(env)),
52-
transports: [ new transports.Console() ],
52+
transports: [new transports.Console()],
5353
});
5454
}
5555

56+
function skipDefaultRequests(req) {
57+
// Consul's Health check regularly bombards us with requests, so we should ignore it.
58+
return (req.headers['user-agent'] === 'Consul Health Check');
59+
}
60+
5661
/**
5762
* Setup an express logger based on the main logger.
5863
*
5964
* @param {String} env The name of the environment to use. This affects formatting.
6065
* @param {String} level The level to use when setting the logger up.
6166
*/
62-
function setupExpressLogger(env, level = DEFAULT_LOG_LEVEL) {
67+
function setupExpressLogger({ env = '', level = DEFAULT_LOG_LEVEL, skip = [] }) {
6368
const logger = setupNodeLogger(env, level);
6469

6570
const loggerMiddleware = expressWinston.logger({
6671
winstonInstance: logger,
6772
metaField: null,
6873
colorize: false,
69-
// Consul's Health check regularly bombards us with requests, so we should ignore it.
70-
skip: (req) => (req.headers['user-agent'] == 'Consul Health Check' && req.url == '/'),
74+
skip: (req) => [skipDefaultRequests, ...skip].every((skipFunc) => skipFunc(req)),
7175
});
7276

7377
return { logger, loggerMiddleware };
7478
}
7579

7680
module.exports = {
7781
setupNodeLogger,
78-
setupExpressLogger
79-
}
82+
setupExpressLogger,
83+
};

package.json

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,14 @@
2323
"@babel/register": "7.0.0",
2424
"capture-console": "1.0.1",
2525
"chai": "4.2.0",
26-
"chance": "1.0.18",
26+
"chance": "1.1.4",
27+
"eslint": "6.8.0",
28+
"eslint-config-airbnb-base": "14.0.0",
29+
"eslint-plugin-import": "2.20.1",
2730
"mocha": "5.2.0"
2831
},
2932
"scripts": {
33+
"lint": "eslint **/*.js",
3034
"test": "mocha --require @babel/register"
3135
}
3236
}

test/logger.test.js

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,15 @@
1-
import chai from 'chai';
21
import capture from 'capture-console';
32
import Chance from 'chance';
3+
import { expect } from 'chai';
44

55
import { setupNodeLogger, setupExpressLogger } from '..';
66

7-
const expect = chai.expect;
87
const chance = new Chance();
98

10-
describe('strigo-node-logger', function() {
11-
describe('#setupNodeLogger()', function() {
12-
it('should printout the configured severity level', function() {
13-
const log = setupNodeLogger(null, 'warn');
9+
describe('strigo-node-logger', () => {
10+
describe('#setupNodeLogger()', () => {
11+
it('should printout the configured severity level', () => {
12+
const log = setupNodeLogger({ level: 'warn' });
1413

1514
let printout;
1615
let stdout;
@@ -32,8 +31,8 @@ describe('strigo-node-logger', function() {
3231
expect(stdout.indexOf('info')).to.be.eq(-1);
3332
});
3433

35-
it('should not write debug printout when set up with info level', function() {
36-
const log = setupNodeLogger('prod', 'info');
34+
it('should not write debug printout when set up with info level', () => {
35+
const log = setupNodeLogger({ env: 'prod', level: 'info' });
3736

3837
const printout = chance.string();
3938
const stdout = capture.captureStdout(() => {
@@ -43,8 +42,8 @@ describe('strigo-node-logger', function() {
4342
expect(stdout.indexOf(printout)).to.be.eq(-1);
4443
});
4544

46-
it('should not write debug printout when configured to info in runtime', function() {
47-
const log = setupNodeLogger('prod', 'debug');
45+
it('should not write debug printout when configured to info in runtime', () => {
46+
const log = setupNodeLogger({ env: 'prod', level: 'debug' });
4847
log.level = 'info';
4948

5049
const printout = chance.string();
@@ -55,8 +54,8 @@ describe('strigo-node-logger', function() {
5554
expect(stdout.indexOf(printout)).to.be.eq(-1);
5655
});
5756

58-
it('should allow setting up an express logger', function() {
59-
const { logger: log, loggerMiddleware: middleware } = setupExpressLogger('prod', 'info');
57+
it('should allow setting up an express logger', () => {
58+
const { logger: log, loggerMiddleware: middleware } = setupExpressLogger({ env: 'prod', level: 'info' });
6059

6160
// Should be a function. This test can be better if we check for specific
6261
// expressWinston attributes.

0 commit comments

Comments
 (0)