Skip to content

Commit 6a932d6

Browse files
committed
feat: Provide a logger instance by default
Create a logger instance by default and retrieve its settings from environment variables. BREAKING_CHANGE
1 parent 61e093c commit 6a932d6

3 files changed

Lines changed: 97 additions & 45 deletions

File tree

README.md

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,20 @@ npm install --save @5app/logger
1010
Then, generate a logger in your app and use it to log messages.
1111

1212
```javascript
13-
const getLogger = require('@5app/logger');
13+
const {logger} = require('@5app/logger');
14+
15+
logger.info('An email was sent', {
16+
email: 'customer@5app.com',
17+
template: 'template1',
18+
});
19+
20+
logger.error(new Error('Unknown playlist 123'));
21+
```
22+
23+
Alternatively, you can create a new instance of logger where you can specify the metadata, logging level, and whether you want simple logs or not:
24+
25+
```javascript
26+
const {getLogger} = require('@5app/logger');
1427

1528
const logger = getLogger({
1629
simple: process.env.NODE_ENV === 'development',
@@ -38,29 +51,48 @@ By default, simple will be false.
3851

3952
Example:
4053
```javascript
41-
const getLogger = require('@5app/logger');
54+
const {getLogger} = require('@5app/logger');
4255

4356
// This logger will log dev-friendly messages
4457
const logger = getLogger({
4558
simple: true,
4659
});
4760
```
4861

62+
The default logger uses the environment variable `LOGS_FORMAT` to determine if the logs are going to be generated in json (`json`) or simple console logs (any other value other than `json`).
63+
4964
### metadata
5065

5166
Metadata is an object containing service metadata like the release tag or the A/B testing experiment we are running.
5267
This object will be added to each log entry when using the JSON mode.
5368

5469
Example:
5570
```javascript
56-
const getLogger = require('@5app/logger');
71+
const {getLogger} = require('@5app/logger');
5772

5873
// This logger will add details about the current release and A/B experiment to every log line
59-
const getLogger = require('@5app/logger');
6074
const logger = getLogger({
6175
metadata: {
6276
release: '1.2.3',
6377
experiment: 12345,
6478
},
6579
});
6680
```
81+
82+
### level
83+
84+
You can specify a minimum logging level using the `level` parameter or using the `LOGS_LEVEL` environment variable.
85+
By default, the logging level will be [debug (npm)](https://github.com/winstonjs/winston#logging-levels).
86+
87+
Example:
88+
```javascript
89+
const {getLogger} = require('@5app/logger');
90+
91+
// This logger will add details about the current release and A/B experiment to every log line
92+
const logger = getLogger({
93+
level: 'warn',
94+
});
95+
96+
logger.info('this message will not be logged');
97+
logger.warn('you will see this message');
98+
```

getLogger.js

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
const winston = require('winston');
2+
3+
const LEVEL = Symbol.for('level');
4+
const {format} = winston;
5+
const sqlFormat = {
6+
level: winston.config.npm.levels.debug,
7+
color: 'grey'
8+
};
9+
10+
winston.addColors({sql: sqlFormat.color});
11+
12+
const colorizer = format.colorize();
13+
const sqlFormatter = format((info, opts) => {
14+
const level = info[LEVEL];
15+
16+
if (opts.colorize && level === 'sql') {
17+
info.message = colorizer.colorize(level, `${info.message}\n`);
18+
}
19+
20+
return info;
21+
});
22+
23+
function getFormatter({simple}) {
24+
if (simple) {
25+
return format.combine(format.splat(), format.colorize(), sqlFormatter({colorize: true}), format.simple());
26+
}
27+
28+
return format.combine(format.splat(), format.timestamp(), format.json());
29+
}
30+
31+
function getLogger({simple, level, metadata}) {
32+
return winston.createLogger({
33+
level,
34+
levels: {
35+
...winston.config.npm.levels,
36+
sql: sqlFormat.level
37+
},
38+
format: getFormatter({simple}),
39+
defaultMeta: metadata,
40+
transports: [new winston.transports.Console()]
41+
});
42+
}
43+
44+
module.exports = getLogger;

index.js

Lines changed: 17 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,20 @@
1-
const winston = require('winston');
2-
3-
const LEVEL = Symbol.for('level');
4-
const {format} = winston;
5-
const sqlFormat = {
6-
level: winston.config.npm.levels.debug,
7-
color: 'grey'
8-
};
9-
10-
winston.addColors({sql: sqlFormat.color});
11-
12-
const colorizer = format.colorize();
13-
const sqlFormatter = format((info, opts) => {
14-
const level = info[LEVEL];
15-
16-
if (opts.colorize && level === 'sql') {
17-
info.message = colorizer.colorize(level, `${info.message}\n`);
1+
const getLogger = require('./getLogger');
2+
3+
const {
4+
LOGS_FORMAT,
5+
LOGS_LEVEL,
6+
TAG
7+
} = process.env;
8+
9+
const logger = getLogger({
10+
simple: LOGS_FORMAT !== 'json',
11+
level: LOGS_LEVEL || 'debug',
12+
metadata: {
13+
tag: TAG
1814
}
19-
20-
return info;
2115
});
2216

23-
function getFormatter({simple}) {
24-
if (simple) {
25-
return format.combine(format.splat(), format.colorize(), sqlFormatter({colorize: true}), format.simple());
26-
}
27-
28-
return format.combine(format.splat(), format.timestamp(), format.json());
29-
}
30-
31-
function getLogger({simple, metadata}) {
32-
return winston.createLogger({
33-
level: simple ? 'debug' : 'info',
34-
levels: {
35-
...winston.config.npm.levels,
36-
sql: sqlFormat.level
37-
},
38-
format: getFormatter({simple}),
39-
defaultMeta: simple ? {} : metadata,
40-
transports: [new winston.transports.Console()]
41-
});
42-
}
43-
44-
module.exports = getLogger;
17+
module.exports = {
18+
logger,
19+
getLogger
20+
};

0 commit comments

Comments
 (0)