@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 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, goto: Manage > Collection, and get the source category
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
  ![Screen Shot 2016-10-10 at 2.03.31 PM.png](https://bitbucket.org/repo/xbXGRo/images/3258406172-Screen%20Shot%202016-10-10%20at%202.03.31%20PM.png)
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
  |---|
@@ -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) {
@@ -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.1",
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 --reporter mochawesome --bail --exit --check-leaks --global serverType,serverId test/",
15
- "test-ci": "c8 --reporter=lcov --reporter=text npm test",
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.1007.0",
36
- "@aws-sdk/client-kinesis": "3.1007.0",
37
- "@smithy/node-http-handler": "4.4.14",
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": "9.39.4",
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": "9.39.4",
52
- "eslint-plugin-import": "2.32.0",
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.2"
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
- });
@@ -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
- });