@mimik/sumologic-winston-logger 2.2.1 → 2.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -7
- package/configuration/config.js +5 -0
- package/index.js +2 -0
- package/lib/awsKinesisTransport.js +2 -0
- package/lib/awsS3Transport.js +2 -0
- package/package.json +10 -10
- package/manual-test/eventsMock.js +0 -26
- package/manual-test/testLog.js +0 -35
- package/manual-test/testLogAndQuit.js +0 -42
- package/manual-test/testLogError.js +0 -12
- package/manual-test/testManyLogs.js +0 -40
package/README.md
CHANGED
|
@@ -160,7 +160,7 @@ To learn more about setting this environment variable, see the section, _Finding
|
|
|
160
160
|
|
|
161
161
|
#### Finding SumoLogic endpoint and collector code ####
|
|
162
162
|
|
|
163
|
-
To find the values that you will apply the environment variables, `SUMO_LOGIC_ENDPOINT` and `SUMO_LOGIC_COLLECTOR_CODE`, in the SumoLogic Control Panel,
|
|
163
|
+
To find the values that you will apply the environment variables, `SUMO_LOGIC_ENDPOINT` and `SUMO_LOGIC_COLLECTOR_CODE`, in the SumoLogic Control Panel, go to: Manage > Collection, and get the source category.
|
|
164
164
|
|
|
165
165
|

|
|
166
166
|
|
|
@@ -194,11 +194,11 @@ Formatting console logs is left to winston, except that some stackTrace info is
|
|
|
194
194
|
|
|
195
195
|
Formatting of SumoLogic logs is handled by this module in the following ways:
|
|
196
196
|
|
|
197
|
-
* only the first argument is used as the message
|
|
198
|
-
* one metadata object can be passed as a parameter; its properties are included in the log entry
|
|
199
|
-
* structured stackTrace info is added to every log except when NO_STACK is set to 'yes'
|
|
200
|
-
* if the last parameter is a string it will be considered as a `correlationId
|
|
201
|
-
* if the last parameter is a plain object **and** there is already an earlier metadata object, its properties are merged into the log entry at the top level (alongside `serverType`/`serverId`) — this is the _extra fields_ feature
|
|
197
|
+
* only the first argument is used as the message,
|
|
198
|
+
* one metadata object can be passed as a parameter; its properties are included in the log entry,
|
|
199
|
+
* structured stackTrace info is added to every log except when NO_STACK is set to 'yes',
|
|
200
|
+
* if the last parameter is a string it will be considered as a `correlationId`,
|
|
201
|
+
* if the last parameter is a plain object **and** there is already an earlier metadata object, its properties are merged into the log entry at the top level (alongside `serverType`/`serverId`) — this is the _extra fields_ feature.
|
|
202
202
|
|
|
203
203
|
|
|
204
204
|
### Logging Examples ###
|
|
@@ -232,7 +232,7 @@ The log() method is also supported, and adds a level parameter in position 1.
|
|
|
232
232
|
|
|
233
233
|
Tailing allows you to scroll through log output in real time. You can trail log data in SumoLogic.
|
|
234
234
|
|
|
235
|
-
To trail in SumoLogic go to Search > Live Tail in the SumoLogic user interface and enter `sourceCategory=<source category>` in the search bar, where `<source category>` is the log you want to trail. Then click, Run
|
|
235
|
+
To trail in SumoLogic go to Search > Live Tail in the SumoLogic user interface and enter `sourceCategory=<source category>` in the search bar, where `<source category>` is the log you want to trail. Then click, Run.
|
|
236
236
|
|
|
237
237
|
|Example|
|
|
238
238
|
|---|
|
package/configuration/config.js
CHANGED
|
@@ -140,6 +140,7 @@ const configuration = {
|
|
|
140
140
|
noStack: process.env.NO_STACK || 'yes',
|
|
141
141
|
};
|
|
142
142
|
configuration.mode = checkMode(process.env.LOG_MODE) || [NONE_MODE];
|
|
143
|
+
/* c8 ignore stop */
|
|
143
144
|
|
|
144
145
|
if (configuration.mode.includes(SUMOLOGIC)) {
|
|
145
146
|
configuration[SUMOLOGIC] = {
|
|
@@ -163,6 +164,7 @@ if (configuration.mode.includes(AWS_KINESIS)) {
|
|
|
163
164
|
},
|
|
164
165
|
};
|
|
165
166
|
|
|
167
|
+
/* c8 ignore next 2 -- optional env vars not set in test */
|
|
166
168
|
if (process.env.KINESIS_AWS_ACCESS_KEY_ID !== undefined) configuration[AWS_KINESIS].accessKeyId = process.env.KINESIS_AWS_ACCESS_KEY_ID;
|
|
167
169
|
if (process.env.KINESIS_AWS_SECRET_ACCESS_KEY !== undefined) configuration[AWS_KINESIS].secretAccessKey = process.env.KINESIS_AWS_SECRET_ACCESS_KEY;
|
|
168
170
|
}
|
|
@@ -175,12 +177,14 @@ if (configuration.mode.includes(AWS_S3)) {
|
|
|
175
177
|
maxEvents: toInt(process.env.S3_AWS_MAX_EVENTS, 1000),
|
|
176
178
|
};
|
|
177
179
|
|
|
180
|
+
/* c8 ignore next 2 -- optional env vars not set in test */
|
|
178
181
|
if (process.env.S3_AWS_ACCESS_KEY_ID !== undefined) configuration[AWS_S3].accessKeyId = process.env.S3_AWS_ACCESS_KEY_ID;
|
|
179
182
|
if (process.env.S3_AWS_SECRET_ACCESS_KEY !== undefined) configuration[AWS_S3].secretAccessKey = process.env.S3_AWS_SECRET_ACCESS_KEY;
|
|
180
183
|
}
|
|
181
184
|
const { filter } = configuration;
|
|
182
185
|
let filterConfig = [];
|
|
183
186
|
|
|
187
|
+
/* c8 ignore start -- FILTER_FILE only set in prod env, module singleton prevents re-evaluation */
|
|
184
188
|
if (filter.file) {
|
|
185
189
|
try {
|
|
186
190
|
filterConfig = JSON.parse(readFileSync(filter.file).toString());
|
|
@@ -189,6 +193,7 @@ if (filter.file) {
|
|
|
189
193
|
throw new Error(`Invalid file for logger config: ${filter.file}`, { cause: err });
|
|
190
194
|
}
|
|
191
195
|
}
|
|
196
|
+
/* c8 ignore stop */
|
|
192
197
|
filter.config = filterConfig;
|
|
193
198
|
checkConfig(configuration);
|
|
194
199
|
|
package/index.js
CHANGED
|
@@ -111,6 +111,7 @@ if (config.mode.includes(AWS_KINESIS)) {
|
|
|
111
111
|
logger.add(awsKinesis);
|
|
112
112
|
}
|
|
113
113
|
|
|
114
|
+
/* c8 ignore start -- flush race-condition branches depend on async transport completion order */
|
|
114
115
|
logger.flushAndExit = (code) => {
|
|
115
116
|
const flushing = () => {
|
|
116
117
|
let sumoDone = false;
|
|
@@ -190,6 +191,7 @@ logger.flush = () => {
|
|
|
190
191
|
|
|
191
192
|
setTimeout(flushing, config.flushExitDelay);
|
|
192
193
|
};
|
|
194
|
+
/* c8 ignore stop */
|
|
193
195
|
|
|
194
196
|
logger.LEVELS = ['error', 'warn', 'info', 'verbose', 'debug', 'silly'];
|
|
195
197
|
|
|
@@ -65,6 +65,7 @@ export default class AwsKinesis extends Transport {
|
|
|
65
65
|
);
|
|
66
66
|
this.kinesis = new KinesisClient(this.kinesisClientConfig);
|
|
67
67
|
|
|
68
|
+
/* c8 ignore start -- timer-based flush; exercised in production, not in unit tests */
|
|
68
69
|
this.time = setInterval(() => {
|
|
69
70
|
Object.keys(events).forEach((level) => {
|
|
70
71
|
if (events[level].Records.length) {
|
|
@@ -74,6 +75,7 @@ export default class AwsKinesis extends Transport {
|
|
|
74
75
|
}
|
|
75
76
|
});
|
|
76
77
|
}, this.timeInterval).unref();
|
|
78
|
+
/* c8 ignore stop */
|
|
77
79
|
}
|
|
78
80
|
|
|
79
81
|
put(Records, lvl) {
|
package/lib/awsS3Transport.js
CHANGED
|
@@ -46,6 +46,7 @@ export default class AwsS3 extends Transport {
|
|
|
46
46
|
}
|
|
47
47
|
this.s3 = new S3Client(this.s3ClientConfig);
|
|
48
48
|
|
|
49
|
+
/* c8 ignore start -- timer-based flush; exercised in production, not in unit tests */
|
|
49
50
|
this.time = setInterval(() => {
|
|
50
51
|
Object.keys(events).forEach((level) => {
|
|
51
52
|
if (events[level].data.length) {
|
|
@@ -63,6 +64,7 @@ export default class AwsS3 extends Transport {
|
|
|
63
64
|
}
|
|
64
65
|
});
|
|
65
66
|
}, this.timeInterval).unref();
|
|
67
|
+
/* c8 ignore stop */
|
|
66
68
|
}
|
|
67
69
|
|
|
68
70
|
put(data, lvl, date) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mimik/sumologic-winston-logger",
|
|
3
|
-
"version": "2.2.
|
|
3
|
+
"version": "2.2.3",
|
|
4
4
|
"description": "Log wrapper for sumo, s3, kinesis and winston",
|
|
5
5
|
"main": "./index.js",
|
|
6
6
|
"type": "module",
|
|
@@ -11,8 +11,8 @@
|
|
|
11
11
|
"scripts": {
|
|
12
12
|
"docs": "jsdoc2md --template docs/README.hbs configuration/config.js > README.md",
|
|
13
13
|
"lint": "eslint . --no-error-on-unmatched-pattern",
|
|
14
|
-
"test": "mocha
|
|
15
|
-
"test-ci": "c8
|
|
14
|
+
"test": "mocha",
|
|
15
|
+
"test-ci": "c8 npm test",
|
|
16
16
|
"prepublishOnly": "npm run docs && npm run lint && npm run test-ci",
|
|
17
17
|
"commit-ready": "npm run docs && npm run lint && npm run test-ci"
|
|
18
18
|
},
|
|
@@ -32,15 +32,15 @@
|
|
|
32
32
|
},
|
|
33
33
|
"dependencies": {
|
|
34
34
|
"@mimik/lib-filters": "^2.0.8",
|
|
35
|
-
"@aws-sdk/client-s3": "3.
|
|
36
|
-
"@aws-sdk/client-kinesis": "3.
|
|
37
|
-
"@smithy/node-http-handler": "4.4.
|
|
35
|
+
"@aws-sdk/client-s3": "3.1008.0",
|
|
36
|
+
"@aws-sdk/client-kinesis": "3.1008.0",
|
|
37
|
+
"@smithy/node-http-handler": "4.4.16",
|
|
38
38
|
"axios": "1.13.6",
|
|
39
39
|
"winston": "3.19.0",
|
|
40
40
|
"winston-transport": "4.9.0"
|
|
41
41
|
},
|
|
42
42
|
"devDependencies": {
|
|
43
|
-
"@eslint/js": "
|
|
43
|
+
"@eslint/js": "10.0.1",
|
|
44
44
|
"@mimik/eslint-plugin-document-env": "^2.0.9",
|
|
45
45
|
"@mimik/eslint-plugin-logger": "^1.0.3",
|
|
46
46
|
"@mimik/request-helper": "^2.0.6",
|
|
@@ -48,14 +48,14 @@
|
|
|
48
48
|
"aws-sdk-client-mock": "4.1.0",
|
|
49
49
|
"c8": "11.0.0",
|
|
50
50
|
"chai": "6.2.2",
|
|
51
|
-
"eslint": "
|
|
52
|
-
"eslint-plugin-import": "
|
|
51
|
+
"eslint": "10.1.0",
|
|
52
|
+
"eslint-plugin-import-x": "4.16.2",
|
|
53
53
|
"express": "5.2.1",
|
|
54
54
|
"globals": "17.4.0",
|
|
55
55
|
"husky": "9.1.7",
|
|
56
56
|
"jsdoc-to-markdown": "9.1.3",
|
|
57
57
|
"mocha": "11.7.5",
|
|
58
58
|
"mochawesome": "7.1.4",
|
|
59
|
-
"sinon": "21.0.
|
|
59
|
+
"sinon": "21.0.3"
|
|
60
60
|
}
|
|
61
61
|
}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
/* eslint-disable no-console */
|
|
2
|
-
import express from 'express';
|
|
3
|
-
|
|
4
|
-
let i = 0;
|
|
5
|
-
const MOCK_PORT = 9000;
|
|
6
|
-
const CREATED_RESPONSE = 201;
|
|
7
|
-
|
|
8
|
-
const app = express();
|
|
9
|
-
const config = {
|
|
10
|
-
port: MOCK_PORT,
|
|
11
|
-
base: '/checkthat',
|
|
12
|
-
};
|
|
13
|
-
|
|
14
|
-
app.post(`${config.base}`, (req, res) => {
|
|
15
|
-
i += 1;
|
|
16
|
-
console.log('Recieved a POST:', i);
|
|
17
|
-
// console.log('headers:', req.headers)
|
|
18
|
-
console.log(req.body);
|
|
19
|
-
|
|
20
|
-
res.statusCode = CREATED_RESPONSE;
|
|
21
|
-
res.send(req.body);
|
|
22
|
-
});
|
|
23
|
-
|
|
24
|
-
app.listen(config.port, () => {
|
|
25
|
-
console.log(`event mock at ${config.port}`);
|
|
26
|
-
});
|
package/manual-test/testLog.js
DELETED
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
/* eslint-disable no-console */
|
|
2
|
-
import '../test/testEnv.js';
|
|
3
|
-
import { getCorrelationId } from '@mimik/request-helper';
|
|
4
|
-
import logger from '../index.js';
|
|
5
|
-
import process from 'node:process';
|
|
6
|
-
|
|
7
|
-
const user = {
|
|
8
|
-
name: 'a name',
|
|
9
|
-
password: 'a password',
|
|
10
|
-
address: {
|
|
11
|
-
street: ' a street',
|
|
12
|
-
test2: 'this is a test2',
|
|
13
|
-
city: 'a city',
|
|
14
|
-
},
|
|
15
|
-
test1: 'this is a test1',
|
|
16
|
-
test2: 'this is a test2',
|
|
17
|
-
};
|
|
18
|
-
const correlationId = getCorrelationId('test-12345');
|
|
19
|
-
const stdin = process.openStdin();
|
|
20
|
-
|
|
21
|
-
logger.info('This is a test, info', {
|
|
22
|
-
user, test: 'this is a test', test2: 'this is a test2', test1: 'this is a test1',
|
|
23
|
-
}, correlationId);
|
|
24
|
-
|
|
25
|
-
logger.debug('This is a test with error', { user }, correlationId);
|
|
26
|
-
|
|
27
|
-
logger.error('This is a test, error', { user }, correlationId);
|
|
28
|
-
|
|
29
|
-
stdin.addListener('data', () => {
|
|
30
|
-
const clonedObject = { ...user };
|
|
31
|
-
|
|
32
|
-
clonedObject.index = 'manual';
|
|
33
|
-
console.log('manual logging');
|
|
34
|
-
logger.info('this is a test', { data: clonedObject }, correlationId);
|
|
35
|
-
});
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import '../test/testEnv';
|
|
2
|
-
import { SYSTEM_ERROR } from '../lib/common.js';
|
|
3
|
-
import logger from '../index.js';
|
|
4
|
-
|
|
5
|
-
const ISSUE_EXIT = 1;
|
|
6
|
-
|
|
7
|
-
const complexObject = {
|
|
8
|
-
key: 'property a',
|
|
9
|
-
propB: {
|
|
10
|
-
propC: 'property c',
|
|
11
|
-
propD: 'property d',
|
|
12
|
-
propE: {
|
|
13
|
-
propF: 'property f',
|
|
14
|
-
},
|
|
15
|
-
},
|
|
16
|
-
};
|
|
17
|
-
complexObject.propG = complexObject;
|
|
18
|
-
const error = new Error('an error');
|
|
19
|
-
error.name = 'this is a complex error';
|
|
20
|
-
error.statusCode = SYSTEM_ERROR;
|
|
21
|
-
error.title = 'System error';
|
|
22
|
-
|
|
23
|
-
logger.info('this is a test', { user: complexObject }, '12345678');
|
|
24
|
-
logger.info('this is a test', { user: complexObject }, '12345678');
|
|
25
|
-
logger.error('this is an error message', { user: complexObject, error, correlationId: '123344' }, '34567');
|
|
26
|
-
logger.error('this is an error message', { user: complexObject, error, correlationId: '123344' }, '34567');
|
|
27
|
-
logger.info('this is a test', { user: complexObject }, '12345678');
|
|
28
|
-
logger.info('this is a test', { user: complexObject }, '12345678');
|
|
29
|
-
logger.info('this is a test', { user: complexObject }, '12345678');
|
|
30
|
-
logger.info('this is a test', { user: complexObject }, '12345678');
|
|
31
|
-
logger.error('this is an error message', { user: complexObject, error, correlationId: '123344' }, '34567');
|
|
32
|
-
logger.error('this is an error message', { user: complexObject, error, correlationId: '123344' }, '34567');
|
|
33
|
-
logger.error('this is an error message', { user: complexObject, error, correlationId: '123344' }, '34567');
|
|
34
|
-
logger.error('this is an error message', { user: complexObject, error, correlationId: '123344' }, '34567');
|
|
35
|
-
logger.info('this is a test', { user: complexObject }, '12345678');
|
|
36
|
-
logger.info('this is a test', { user: complexObject }, '12345678');
|
|
37
|
-
logger.info('this is a test', { user: complexObject }, '12345678');
|
|
38
|
-
logger.error('this is an error message', { user: complexObject, error, correlationId: '123344' }, '34567');
|
|
39
|
-
logger.error('this is an error message', { user: complexObject, error, correlationId: '123344' }, '34567');
|
|
40
|
-
logger.flushAndExit(ISSUE_EXIT);
|
|
41
|
-
// setTimeout(() => console.log('done'), 4000);
|
|
42
|
-
// logger.error(error, { user: complexObject }, '6795949');
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import '../test/testEnv.js';
|
|
2
|
-
import { getCorrelationId } from '@mimik/request-helper';
|
|
3
|
-
import logger from '../index.js';
|
|
4
|
-
|
|
5
|
-
const error = new Error('this is a simple error');
|
|
6
|
-
const errorCause = new Error('this is an error with cause', { cause: error });
|
|
7
|
-
const errorCauseInfo = new Error('this is an error with cause and info', { cause: errorCause });
|
|
8
|
-
errorCauseInfo.info = 'this is an info';
|
|
9
|
-
const correlationId = getCorrelationId('test-12345');
|
|
10
|
-
|
|
11
|
-
// logger.error('This is an error in object', { errorCauseInfo }, correlationId);
|
|
12
|
-
logger.error('This is an error object ', errorCauseInfo, correlationId);
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
/* eslint-disable no-console */
|
|
2
|
-
import '../test/testEnv.js';
|
|
3
|
-
import { getCorrelationId } from '@mimik/request-helper';
|
|
4
|
-
import logger from '../index.js';
|
|
5
|
-
|
|
6
|
-
const MAX_ITEMS = 100000;
|
|
7
|
-
|
|
8
|
-
const complexObject = {
|
|
9
|
-
key: 'property a',
|
|
10
|
-
propB: {
|
|
11
|
-
propC: 'property c',
|
|
12
|
-
propD: 'property d',
|
|
13
|
-
propE: {
|
|
14
|
-
propF: 'property f',
|
|
15
|
-
},
|
|
16
|
-
},
|
|
17
|
-
};
|
|
18
|
-
complexObject.propG = complexObject;
|
|
19
|
-
const object = {
|
|
20
|
-
user: {
|
|
21
|
-
userId: 'a long userid simulating a uuid',
|
|
22
|
-
info: 'this is a test',
|
|
23
|
-
correlationId: getCorrelationId('a long uuid to simulate a correlationId'),
|
|
24
|
-
},
|
|
25
|
-
};
|
|
26
|
-
const objects = [];
|
|
27
|
-
|
|
28
|
-
for (let i = 0; i < MAX_ITEMS; i += 1) {
|
|
29
|
-
const clonedObject = { ...object };
|
|
30
|
-
|
|
31
|
-
clonedObject.index = i;
|
|
32
|
-
objects.push(clonedObject);
|
|
33
|
-
}
|
|
34
|
-
const startDate = new Date();
|
|
35
|
-
|
|
36
|
-
console.log('Test start at:', startDate.toISOString(), 'with:', MAX_ITEMS, 'items');
|
|
37
|
-
Promise.all(objects.map(obj => logger.info('This is a test', { data: obj }, getCorrelationId('test-correlation-id')))).then(() => {
|
|
38
|
-
const endDate = new Date();
|
|
39
|
-
console.log('Test end at:', endDate.toISOString(), 'duration:', endDate - startDate, 'with:', MAX_ITEMS, 'items');
|
|
40
|
-
});
|