Skip to content

Commit

Permalink
Merge pull request #3 from hidori/feature/fix-readme-md
Browse files Browse the repository at this point in the history
Refactored more :-)
  • Loading branch information
hidori committed Mar 14, 2018
2 parents c540669 + 60ad2a9 commit 0ef1595
Show file tree
Hide file tree
Showing 6 changed files with 121 additions and 88 deletions.
2 changes: 2 additions & 0 deletions .codeclimate.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
exclude_patterns:
- "**/*.test.js"
43 changes: 13 additions & 30 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,22 @@ const Logger = require('node-json-logger');
const logger = new Logger();

logger.info('info.');
logger.info('info.', { data: 'data.' });
logger.info('info.', { data1: 'data#1', data2: 'data#2' });
```
Output:
```json
{"level":"info","message":"info."}
{"level":"info","message":"info.","details":{"data":"data."}}
{"timestamp":"2001-03-14T01:00:00.000Z","level":"info","message":"info."}
{"timestamp":"2001-03-14T01:00:00.000Z","level":"info","message":"info.","data1":"data#1","data2":"data#2"}}
```

# <a href="#Levels"></a>Levels
* trace
* debug
* info
* warn
* error
* fatal

# API
```js
logger.xxx(message, details)
Expand Down Expand Up @@ -52,8 +60,8 @@ logger.fatal('fatal.');
```
Output:
```json
{"level":"error","message":"error."}
{"level":"fatal","message":"fatal."}
{"timestamp":"2001-03-14T01:00:00.000Z","level":"error","message":"error."}
{"timestamp":"2001-03-14T01:00:00.000Z","level":"fatal","message":"fatal."}
```
Level and output:

Expand All @@ -66,31 +74,6 @@ Level and output:
| `{ level: 'error' }` | - | - | - | - | O | O |
| `{ level: 'fatal' }` | - | - | - | - | - | O |

## addendum
Spcify addeundum fields. (optional)
```js
const Logger = require('node-json-logger');
const logger = new Logger({
addendum: {
source: 'source.',
},
});

logger.info('info.');
```
Output:
```json
{"level":"info","source":"source.","message":"info."}
```

# <a href="#Levels"></a>Levels
* trace
* debug
* info
* warn
* error
* fatal

# License
MIT

Expand Down
55 changes: 33 additions & 22 deletions index.js
Original file line number Diff line number Diff line change
@@ -1,22 +1,22 @@
'use strict';

const Level = {
fatal: 0,
error: 1,
warn: 2,
info: 3,
debug: 4,
trace: 5,
};
const moment = require('moment');

const levels = ['fatal', 'error', 'warn', 'info', 'debug', 'trace'];

class Logger {
constructor(options) {
this.options = options || {};
this.options = Object.create(options || {});
this.options.timestamp = (this.options.timestamp === undefined) ? true : !!this.options.timestamp;
this.options.level = (this.options.level || 'debug').toLowerCase();
this.options.addendum = this.options.addendum || {};
this.options.log = this.options.log || console.log;
const level = (this.options.level in Level) ? this.options.level : 'debug';
this.options.source = this.options.source || undefined;

this.getTimestamp = () => moment.utc().format('YYYY-MM-DDTHH:mm:ss.SSS[Z]');
this.formatLog = JSON.stringify;
this.writeLog = console.log;

this.trace = this.debug = this.info = this.warn = this.error = this.fatal = () => { };
const level = levels.includes(this.options.level) ? this.options.level : 'debug';
switch (level) {
case 'trace':
this.trace = (message, details) => this.output('trace', message, details);
Expand All @@ -31,19 +31,30 @@ class Logger {
case 'fatal':
this.fatal = (message, details) => this.output('fatal', message, details);
}
this.log = message => this.options.log(message);
}

output(level, message, details) {
const addendum = Object.assign({}, this.options.addendum);
delete addendum.level;
delete addendum.message;
delete addendum.details;
const data = Object.assign(Object.assign({ level : level }, addendum), details
? { message: message, details: details }
: { message: message },
addendum);
this.log(JSON.stringify(data));
const head = {};
const tail = Object.assign({}, details || {});

if (this.options.timestamp) {
head.timestamp = this.getTimestamp();
delete tail.timestamp;
}

head.level = level;
delete tail.level;

if (this.options.source !== undefined) {
head.source = this.options.source;
delete tail.source;
}

head.message = message + '';
delete tail.message;

const log = Object.assign(head, tail);
this.writeLog(this.formatLog(log));
}
}

Expand Down
73 changes: 51 additions & 22 deletions index.test.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
'use strict';

const test = require('ava');

const Logger = require('./index');
const Console = class {

class Console {
constructor() {
this.lines = [];
this.log = message => this.lines.push(message);
Expand All @@ -21,20 +21,22 @@ test('Logger output a log in the format designed.', t => {
'error',
'fatal',
];
let console = new Console();
let logger = new Logger({ level: 'trace' });
logger.log = console.log;
const console = new Console();
const logger = new Logger({ level: 'trace' });
const timestamp = "2001-03-14T01:00:00.000Z";
logger.getTimestamp = () => timestamp;
logger.writeLog = console.log;

level.forEach(l => {
logger[l](`${l}.`);
t.is(console.last(), `{"level":"${l}","message":"${l}."}`);
t.is(console.last(), `{"timestamp":"${timestamp}","level":"${l}","message":"${l}."}`);

logger[l](`${l}.`, { data: `${l}.` });
t.is(console.last(), `{"level":"${l}","message":"${l}.","details":{"data":"${l}."}}`);
logger[l](`${l}.`, { data1: `${l}#1`, data2: `${l}#2` });
t.is(console.last(), `{"timestamp":"${timestamp}","level":"${l}","message":"${l}.","data1":"${l}#1","data2":"${l}#2"}`);
});
});

test('Logger can output a log contains addendums.', t => {
test('Logger can output a log contains source.', t => {
const level = [
'trace',
'debug',
Expand All @@ -43,26 +45,27 @@ test('Logger can output a log contains addendums.', t => {
'error',
'fatal',
];
let console = new Console();
let logger = new Logger({
const console = new Console();
const logger = new Logger({
level: 'trace',
addendum: {
source: 'source.',
},
source: 'source.',
});
logger.log = console.log;
const timestamp = "2001-03-14T01:00:00.000Z";
logger.getTimestamp = () => timestamp;
logger.writeLog = console.log;

level.forEach(l => {
logger[l](`${l}.`);
t.is(console.last(), `{"level":"${l}","source":"${logger.options.addendum.source}","message":"${l}."}`);
t.is(console.last(), `{"timestamp":"${timestamp}","level":"${l}","source":"${logger.options.source}","message":"${l}."}`);

logger[l](`${l}.`, { data: `${l}..` });
t.is(console.last(), `{"level":"${l}","source":"${logger.options.addendum.source}","message":"${l}.","details":{"data":"${l}.."}}`);
logger[l](`${l}.`, { data1: `${l}#1`, data2: `${l}#2` });
t.is(console.last(), `{"timestamp":"${timestamp}","level":"${l}","source":"${logger.options.source}","message":"${l}.","data1":"${l}#1","data2":"${l}#2"}`);
});
});

test('Logger output a log on the log level as configured.', t => {
const config = [
{ options: undefined, expected: [true, false, false, false, false, false] },
{ options: {}, expected: [true, false, false, false, false, false] },
{ options: { level: 'trace' }, expected: [false, false, false, false, false, false] },
{ options: { level: 'debug' }, expected: [true, false, false, false, false, false] },
Expand All @@ -73,10 +76,12 @@ test('Logger output a log on the log level as configured.', t => {
{ options: { level: 'unknown*level' }, expected: [true, false, false, false, false, false] },
];
config.forEach(c => {
let console = new Console();
let logger = new Logger(c.options);
logger.log = console.log;

const console = new Console();
const logger = new Logger(c.options);
const timestamp = "2001-03-14T01:00:00.000Z";
logger.getTimestamp = () => timestamp;
logger.writeLog = console.log;

logger.trace('trace.');
t.true((console.last() === null) === c.expected[0]);

Expand All @@ -97,3 +102,27 @@ test('Logger output a log on the log level as configured.', t => {
});
t.pass();
});

test('Timestamp can be disiable with config.', t => {
const level = [
'trace',
'debug',
'info',
'warn',
'error',
'fatal',
];
const console = new Console();
const logger = new Logger({ level: 'trace', timestamp: false });
const timestamp = "2001-03-14T01:00:00.000Z";
logger.getTimestamp = () => timestamp;
logger.writeLog = console.log;

level.forEach(l => {
logger[l](`${l}.`);
t.is(console.last(), `{"level":"${l}","message":"${l}."}`);

logger[l](`${l}.`, { data1: `${l}#1`, data2: `${l}#2` });
t.is(console.last(), `{"level":"${l}","message":"${l}.","data1":"${l}#1","data2":"${l}#2"}`);
});
});
5 changes: 5 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

31 changes: 17 additions & 14 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,30 +2,33 @@
"name": "node-json-logger",
"version": "0.0.4",
"description": "write logs as JSON to STDOUT",
"author": "hidori",
"license": "MIT",
"keywords": [
"logger",
"json"
],
"homepage": "https://github.com/hidori/node-json-logger#readme",
"repository": {
"type": "git",
"url": "git+https://github.com/hidori/node-json-logger.git"
},
"bugs": {
"url": "https://github.com/hidori/node-json-logger/issues"
},
"main": "index.js",
"scripts": {
"test": "nyc ava --verbose",
"preversion": "npm test",
"version": "git add --all",
"postversion": "git push && git push --tags"
},
"repository": {
"type": "git",
"url": "git+https://github.com/hidori/node-json-logger.git"
"dependencies": {
"moment": "^2.21.0"
},
"keywords": [
"logger",
"json"
],
"author": "hidori",
"license": "MIT",
"bugs": {
"url": "https://github.com/hidori/node-json-logger/issues"
},
"homepage": "https://github.com/hidori/node-json-logger#readme",
"devDependencies": {
"ava": "^0.25.0",
"coveralls": "^3.0.0",
"nyc": "^11.4.1"
}
}
}

0 comments on commit 0ef1595

Please sign in to comment.