@mimik/sumologic-winston-logger 1.6.22 → 2.0.0

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/lib/common.js CHANGED
@@ -5,13 +5,13 @@ const DEFAULT_LEVEL = 'debug';
5
5
  const DEFAULT_ENV = ENV_LOCAL;
6
6
  const DEFAULT_FILTER_FILE = null;
7
7
 
8
- const ALL = 'all'; // legacy support
9
- const NONE = 'none';
8
+ const ALL_MODE = 'all'; // legacy support
9
+ const NONE_MODE = 'none';
10
10
  const AWS_S3 = 'awsS3';
11
11
  const SUMOLOGIC = 'sumologic';
12
12
  const AWS_KINESIS = 'awsKinesis';
13
- const DEFAULT_MODE = [NONE];
14
- const ALL_MODES = [AWS_S3, SUMOLOGIC, AWS_KINESIS, ALL, NONE];
13
+ const DEFAULT_MODE = [NONE_MODE];
14
+ const ALL_MODES = [AWS_S3, SUMOLOGIC, AWS_KINESIS, ALL_MODE, NONE_MODE];
15
15
 
16
16
  const DEFAULT_S3_MAX_SIZE = 5; // max size of the data before sending to S3, in mB
17
17
  const DEFAULT_S3_MAX_EVENTS = 1000; // max number of events before sending to S3
@@ -41,39 +41,39 @@ const INFO = 'info';
41
41
  const ERROR = 'error';
42
42
  const OTHER = 'other';
43
43
 
44
- module.exports = {
45
- DEFAULT_LEVEL,
44
+ export {
45
+ ALL_MODE,
46
+ ALL_MODES,
47
+ AWS_KINESIS,
48
+ AWS_S3,
49
+ CLIENTS,
46
50
  DEFAULT_ENV,
51
+ DEFAULT_EXIT_DELAY,
47
52
  DEFAULT_FILTER_FILE,
48
- AWS_S3,
49
- AWS_KINESIS,
50
- SUMOLOGIC,
51
- DEFAULT_MODE,
52
- ALL,
53
- NONE,
54
- ALL_MODES,
55
- ENV_DEV,
56
- ENV_LOCAL,
57
- DEFAULT_S3_MAX_SIZE,
58
- DEFAULT_S3_MAX_EVENTS,
59
- DEFAULT_S3_TIMEOUT,
60
- DEFAULT_KINESIS_MAX_SIZE,
61
53
  DEFAULT_KINESIS_MAX_EVENTS,
54
+ DEFAULT_KINESIS_MAX_SIZE,
62
55
  DEFAULT_KINESIS_TIMEOUT,
63
- DEFAULT_EXIT_DELAY,
56
+ DEFAULT_LEVEL,
57
+ DEFAULT_MODE,
64
58
  DEFAULT_NO_STACK,
65
- SPLAT,
66
- LEVEL,
67
- MESSAGE,
68
- WARN,
69
- LOG,
59
+ DEFAULT_S3_MAX_EVENTS,
60
+ DEFAULT_S3_MAX_SIZE,
61
+ DEFAULT_S3_TIMEOUT,
62
+ ENV_DEV,
63
+ ENV_LOCAL,
64
+ ERROR,
70
65
  FLUSH,
71
66
  FLUSH_EXIT,
72
- UNKNOWN_TYPE,
73
- UNKNOWN_ID,
74
- CLIENTS,
75
- PARTITION_KEY,
76
67
  INFO,
77
- ERROR,
68
+ LEVEL,
69
+ LOG,
70
+ MESSAGE,
71
+ NONE_MODE,
78
72
  OTHER,
73
+ PARTITION_KEY,
74
+ SPLAT,
75
+ SUMOLOGIC,
76
+ UNKNOWN_TYPE,
77
+ UNKNOWN_ID,
78
+ WARN,
79
79
  };
package/lib/formatLib.js CHANGED
@@ -1,20 +1,19 @@
1
- const { format } = require('winston');
2
- const forEach = require('lodash.foreach');
3
- const isObject = require('lodash.isobject');
4
- const isString = require('lodash.isstring');
5
- const isNil = require('lodash.isnil');
6
-
7
- const { logs } = require('@mimik/lib-filters');
8
-
9
- const { parseStack } = require('./stackLib');
10
-
11
- const {
12
- SPLAT,
13
- LEVEL,
14
- MESSAGE,
1
+ import {
15
2
  ENV_DEV,
16
3
  ENV_LOCAL,
17
- } = require('./common');
4
+ LEVEL,
5
+ MESSAGE,
6
+ SPLAT,
7
+ } from './common.js';
8
+ import forEach from 'lodash.foreach';
9
+ import { format } from 'winston';
10
+ import isNil from 'lodash.isnil';
11
+ import isObject from 'lodash.isobject';
12
+ import isString from 'lodash.isstring';
13
+ import { logs } from '@mimik/lib-filters';
14
+ import { parseStack } from './stackLib.js';
15
+
16
+ const INDEX_ADJUST = 1;
18
17
 
19
18
  const isReserved = (value) => {
20
19
  if (value === LEVEL || value === 'level') return true;
@@ -44,17 +43,17 @@ const correlationId = format((origInfo) => {
44
43
  const info = origInfo;
45
44
  const meta = info[SPLAT];
46
45
 
47
- if (meta && isString(meta[meta.length - 1])) {
48
- const results = meta[meta.length - 1].split('/');
46
+ if (meta && isString(meta[meta.length - INDEX_ADJUST])) {
47
+ const results = meta[meta.length - INDEX_ADJUST].split('/');
49
48
 
50
49
  ([info.correlationId, info.requestedAt] = results);
51
50
  }
52
- if (!info.correlationId) info.step = undefined;
53
- else {
51
+ if (info.correlationId) {
54
52
  const resultsSteps = info.correlationId.split('@');
55
53
 
56
54
  ([info.correlationId, info.step] = resultsSteps);
57
55
  }
56
+ else info.step = undefined;
58
57
  if (info.step) info.step = parseInt(info.step, 10);
59
58
  return info;
60
59
  });
@@ -72,11 +71,15 @@ const filterMeta = format((origInfo, opts) => {
72
71
  let item = origItem;
73
72
 
74
73
  // in order to vaoid having the do it for in the rest of the code for mongoose objects
75
- try { item = origItem.toObject(); }
76
- catch (err) {
74
+ try {
75
+ item = origItem.toObject();
76
+ }
77
+ catch {
77
78
  Object.keys(item).forEach((key) => {
78
- try { item[key] = item[key].toObject(); }
79
- catch (keyErr) {
79
+ try {
80
+ item[key] = item[key].toObject();
81
+ }
82
+ catch {
80
83
  // do nothing
81
84
  }
82
85
  });
@@ -97,7 +100,7 @@ const filterMeta = format((origInfo, opts) => {
97
100
  return info;
98
101
  });
99
102
 
100
- module.exports = {
103
+ export {
101
104
  stackInfo,
102
105
  correlationId,
103
106
  filterMeta,
package/lib/stackLib.js CHANGED
@@ -1,36 +1,51 @@
1
- const crypto = require('crypto');
2
- const path = require('path');
3
- const reject = require('lodash.reject');
4
- const trimStart = require('lodash.trimstart');
1
+ import crypto from 'crypto';
2
+ import {
3
+ fileURLToPath,
4
+ } from 'url';
5
+ import path from 'path';
6
+ import reject from 'lodash.reject';
7
+ import trimStart from 'lodash.trimstart';
5
8
 
6
9
  // Stack trace format :
7
10
  // https://github.com/v8/v8/wiki/Stack%20Trace%20API
8
11
  // these regexes are used to pull out the parts of the stack trace like method name, line number, etc.
9
- const STACKREG = /at\s+(.*)\s+\((.*):(\d*):(\d*)\)/i;
10
- const STACKREG2 = /at\s+()(.*):(\d*):(\d*)/i;
12
+ const STACKREG = /at\s+(?<method>.*)\s+\((?<path>.*):(?<line>\d*):(?<position>\d*)\)/iu;
13
+ const STACKREG2 = /at\s+(?<method>)(?<path>.*):(?<line>\d*):(?<position>\d*)/iu;
11
14
  const SECRET = 'a secret for creating the hash';
12
15
 
16
+ const POSITION = 4;
17
+ const LINE = 3;
18
+ const PATH = 2;
19
+ const METHOD = 1;
20
+ const SHIFT = ' ';
21
+ const ALL_STACK = 5;
22
+ const FIRST_LINE = 0;
23
+ const NO_LINE = 0;
24
+ const STACK_SLICE = 1;
25
+
26
+ const filename = fileURLToPath(import.meta.url);
27
+
13
28
  const parseStack = (newError) => {
14
29
  // get call stack, and analyze it
15
30
  // get the file, method and line number
16
31
  // slice to drop the line that just says "Error"
17
- const stackList = newError.stack.split('\n').slice(1);
32
+ const stackList = newError.stack.split('\n').slice(STACK_SLICE);
18
33
  // remove all lines that refer to this file.
19
34
  // start the stack trace from the code that called this module.
20
- const truncatedList = reject(stackList, (line) => line.includes(__filename) || line.includes('winston') || line.includes('logform') || line.includes('formatLib'));
35
+ const truncatedList = reject(stackList, line => line.includes(filename) || line.includes('winston') || line.includes('logform') || line.includes('formatLib'));
21
36
 
22
- if (truncatedList.length === 0) return null;
23
- const firstLine = truncatedList[0];
37
+ if (truncatedList.length === NO_LINE) return null;
38
+ const firstLine = truncatedList[FIRST_LINE];
24
39
  const stackParts = STACKREG.exec(firstLine) || STACKREG2.exec(firstLine);
25
40
 
26
- if (stackParts && stackParts.length !== 5) return null;
41
+ if (stackParts && stackParts.length !== ALL_STACK) return null;
27
42
  const stackInfo = {
28
- method: stackParts[1],
29
- path: stackParts[2],
30
- line: stackParts[3],
31
- pos: stackParts[4],
32
- file: path.basename(stackParts[2]),
33
- stack: ` ${trimStart(truncatedList.join('\n'))}`,
43
+ method: stackParts[METHOD],
44
+ path: stackParts[PATH],
45
+ line: stackParts[LINE],
46
+ pos: stackParts[POSITION],
47
+ file: path.basename(stackParts[PATH]),
48
+ stack: `${SHIFT}${trimStart(truncatedList.join('\n'))}`,
34
49
  };
35
50
  stackInfo.hash = crypto.createHash('sha256', SECRET)
36
51
  .update(stackInfo.stack)
@@ -40,6 +55,6 @@ const parseStack = (newError) => {
40
55
  return stackInfo;
41
56
  };
42
57
 
43
- module.exports = {
58
+ export {
44
59
  parseStack,
45
60
  };
@@ -1,17 +1,23 @@
1
- const axios = require('axios');
2
- const Transport = require('winston-transport');
3
-
4
- const {
5
- SUMOLOGIC,
6
- LOG,
7
- WARN,
8
- UNKNOWN_TYPE,
9
- UNKNOWN_ID,
1
+ import {
10
2
  CLIENTS,
3
+ LOG,
11
4
  SPLAT,
12
- } = require('./common');
5
+ SUMOLOGIC,
6
+ UNKNOWN_ID,
7
+ UNKNOWN_TYPE,
8
+ WARN,
9
+ } from './common.js';
10
+ import Transport from 'winston-transport';
11
+ import axios from 'axios';
12
+ import {
13
+ setImmediate,
14
+ } from 'timers';
15
+
16
+ const UNAUTHORIZED_ERROR = 401;
17
+ const NOTFOUND_ERROR = 404;
18
+ const SYSTEM_ERROR = 500;
13
19
 
14
- module.exports = class Sumo extends Transport {
20
+ export default class Sumo extends Transport {
15
21
  constructor(options = {}) {
16
22
  super(options);
17
23
  this.serverType = options.serverType || UNKNOWN_TYPE;
@@ -22,8 +28,8 @@ module.exports = class Sumo extends Transport {
22
28
  }
23
29
 
24
30
  log(info, callback) {
25
- const { serverType } = global;
26
- let { serverId } = global;
31
+ const { serverType } = globalThis;
32
+ let { serverId } = globalThis;
27
33
  const data = info;
28
34
 
29
35
  if (serverType) {
@@ -48,18 +54,18 @@ module.exports = class Sumo extends Transport {
48
54
 
49
55
  if (info && info[SPLAT] && Array.isArray(info[SPLAT])) [, resp.correlationId] = info[SPLAT];
50
56
  if (!response) {
51
- resp.error = { statusCode: 500, code: err.code, message: err.message };
57
+ resp.error = { statusCode: SYSTEM_ERROR, code: err.code, message: err.message };
52
58
  return this.emit(WARN, resp);
53
59
  }
54
60
  const { status } = response;
55
61
 
56
- resp.error = { statusCode: status || 500 };
57
- if (status >= 500) resp.error.message = `${SUMOLOGIC} is not reachable`;
58
- else if (status === 401) {
62
+ resp.error = { statusCode: status || SYSTEM_ERROR };
63
+ if (status >= SYSTEM_ERROR) resp.error.message = `${SUMOLOGIC} is not reachable`;
64
+ else if (status === UNAUTHORIZED_ERROR) {
59
65
  resp.error.message = `invalid ${SUMOLOGIC} code`;
60
66
  resp.code = this.code;
61
67
  }
62
- else if (status === 404) resp.error.message = `invalid ${SUMOLOGIC} endpoint`;
68
+ else if (status === NOTFOUND_ERROR) resp.error.message = `invalid ${SUMOLOGIC} endpoint`;
63
69
  else resp.error.message = `could not log to ${SUMOLOGIC}`;
64
70
  return this.emit(WARN, resp);
65
71
  });
@@ -1,6 +1,8 @@
1
1
  /* eslint-disable no-console */
2
- const express = require('express');
3
- const bodyParser = require('body-parser');
2
+ import bodyParser from 'body-parser';
3
+ import express from 'express';
4
+
5
+ const INCR = 1;
4
6
 
5
7
  let i = 0;
6
8
 
@@ -12,7 +14,7 @@ const config = {
12
14
 
13
15
  app.use(bodyParser.json());
14
16
  app.post(`${config.base}`, (req, res) => {
15
- i += 1;
17
+ i += INCR;
16
18
  console.log('Recieved a POST:', i);
17
19
  // console.log('headers:', req.headers)
18
20
  console.log(req.body);
@@ -1,8 +1,9 @@
1
1
  /* eslint-disable no-console */
2
- const _ = require('lodash');
3
-
4
- require('../test/testEnv');
5
- const logger = require('../index');
2
+ import '../test/testEnv.js';
3
+ import clone from 'lodash.clone';
4
+ import { getCorrelationId } from '@mimik/request-helper';
5
+ import logger from '../index.js';
6
+ import process from 'process';
6
7
 
7
8
  const user = {
8
9
  name: 'a name',
@@ -15,7 +16,7 @@ const user = {
15
16
  test1: 'this is a test1',
16
17
  test2: 'this is a test2',
17
18
  };
18
- const correlationId = 'test-12345';
19
+ const correlationId = getCorrelationId('test-12345');
19
20
  const stdin = process.openStdin();
20
21
 
21
22
  logger.info('This is a test, info', {
@@ -27,7 +28,7 @@ logger.debug('This is a test with error', { user }, correlationId);
27
28
  logger.error('This is a test, error', { user }, correlationId);
28
29
 
29
30
  stdin.addListener('data', () => {
30
- const clonedObject = _.clone(user);
31
+ const clonedObject = clone(user);
31
32
 
32
33
  clonedObject.index = 'manual';
33
34
  console.log('manual logging');
@@ -1,17 +1,19 @@
1
- require('../test/testEnv');
2
- const logger = require('../index');
1
+ import '../test/testEnv';
2
+ import logger from '../index.js';
3
+
4
+ const ISSUE_EXIT = 1;
3
5
 
4
6
  const complexObject = {
5
7
  key: 'property a',
6
- b: {
7
- c: 'property c',
8
- d: 'property d',
9
- e: {
10
- f: 'property f',
8
+ propB: {
9
+ propC: 'property c',
10
+ propD: 'property d',
11
+ propE: {
12
+ propF: 'property f',
11
13
  },
12
14
  },
13
15
  };
14
- complexObject.g = complexObject;
16
+ complexObject.propG = complexObject;
15
17
  const error = new Error('an error');
16
18
  error.name = 'this is a complex error';
17
19
  error.statusCode = 500;
@@ -35,7 +37,7 @@ logger.info('this is a test', { user: complexObject }, '12345678');
35
37
  logger.info('this is a test', { user: complexObject }, '12345678');
36
38
  logger.error('this is an error message', { user: complexObject, error, correlationId: '123344' }, '34567');
37
39
  logger.error('this is an error message', { user: complexObject, error, correlationId: '123344' }, '34567');
38
- logger.flushAndExit(1);
40
+ logger.flushAndExit(ISSUE_EXIT);
39
41
  // setTimeout(() => console.log('done'), 4000);
40
42
  // console.log('----------')
41
43
  // logger.error(error, { user: complexObject }, '6795949');
@@ -1,12 +1,12 @@
1
- /* eslint-disable no-console */
2
- require('../test/testEnv');
3
- const logger = require('../index');
1
+ import '../test/testEnv.js';
2
+ import { getCorrelationId } from '@mimik/request-helper';
3
+ import logger from '../index.js';
4
4
 
5
5
  const error = new Error('this is a simple error');
6
6
  const errorCause = new Error('this is an error with cause', { cause: error });
7
7
  const errorCauseInfo = new Error('this is an error with cause and info', { cause: errorCause });
8
8
  errorCauseInfo.info = 'this is an info';
9
- const correlationId = 'test-12345';
9
+ const correlationId = getCorrelationId('test-12345');
10
10
 
11
11
  // logger.error('This is an error in object', { errorCauseInfo }, correlationId);
12
12
  logger.error('This is an error object ', errorCauseInfo, correlationId);
@@ -1,34 +1,35 @@
1
1
  /* eslint-disable no-console */
2
- const _ = require('lodash');
3
- const Promise = require('bluebird');
4
-
5
- require('../test/testEnv');
6
- const logger = require('../index');
2
+ import '../test/testEnv.js';
3
+ import Promise from 'bluebird';
4
+ import clone from 'lodash.clone';
5
+ import { getCorrelationId } from '@mimik/request-helper';
6
+ import logger from '../index.js';
7
7
 
8
8
  const MAX_ITEMS = 100000;
9
+ const INCR = 1;
9
10
 
10
11
  const complexObject = {
11
12
  key: 'property a',
12
- b: {
13
- c: 'property c',
14
- d: 'property d',
15
- e: {
16
- f: 'property f',
13
+ propB: {
14
+ propC: 'property c',
15
+ propD: 'property d',
16
+ propE: {
17
+ propF: 'property f',
17
18
  },
18
19
  },
19
20
  };
20
- complexObject.g = complexObject;
21
+ complexObject.propG = complexObject;
21
22
  const object = {
22
23
  user: {
23
24
  userId: 'a long userid simulating a uuid',
24
25
  info: 'this is a test',
25
- correlationId: 'a long uuid to simulate a correaltionId',
26
+ correlationId: getCorrelationId('a long uuid to simulate a correlationId'),
26
27
  },
27
28
  };
28
29
  const objects = [];
29
30
 
30
- for (let i = 0; i < MAX_ITEMS; i += 1) {
31
- const clonedObject = _.clone(object);
31
+ for (let i = 0; i < MAX_ITEMS; i += INCR) {
32
+ const clonedObject = clone(object);
32
33
 
33
34
  clonedObject.index = i;
34
35
  objects.push(clonedObject);
@@ -36,7 +37,7 @@ for (let i = 0; i < MAX_ITEMS; i += 1) {
36
37
  const startDate = new Date();
37
38
 
38
39
  console.log('Test start at:', startDate.toISOString(), 'with:', MAX_ITEMS, 'items');
39
- Promise.map(objects, (obj) => logger.info('This is a test', { data: obj }, 'test-correlation-id')).then(() => {
40
+ Promise.map(objects, obj => logger.info('This is a test', { data: obj }, getCorrelationId('test-correlation-id'))).then(() => {
40
41
  const endDate = new Date();
41
42
  console.log('Test end at:', endDate.toISOString(), 'duration:', endDate - startDate, 'with:', MAX_ITEMS, 'items');
42
43
  });
package/package.json CHANGED
@@ -1,13 +1,14 @@
1
1
  {
2
2
  "name": "@mimik/sumologic-winston-logger",
3
- "version": "1.6.22",
3
+ "version": "2.0.0",
4
4
  "description": "Log wrapper for sumo, s3, kinesis and winston",
5
- "main": "index.js",
5
+ "main": "./index.js",
6
+ "type": "module",
6
7
  "scripts": {
7
- "lint": "eslint --ignore-path .gitignore .",
8
+ "lint": "eslint . --no-error-on-unmatched-pattern",
8
9
  "docs": "jsdoc2md configuration/config.js > README.md && cat README_Supplement.md >> README.md",
9
- "test": "mocha --reporter mochawesome --bail --check-leaks test/",
10
- "test-ci": "nyc --reporter=lcov --reporter=text npm test",
10
+ "test": "mocha --reporter mochawesome --bail --check-leaks test/loggerProd.spec.js test/logger.spec.js",
11
+ "test-ci": "c8 --reporter=lcov --reporter=text npm test --exit",
11
12
  "prepublishOnly": "npm run docs && npm run lint && npm run test-ci",
12
13
  "commit-ready": "npm run docs && npm run lint && npm run test-ci"
13
14
  },
@@ -32,10 +33,10 @@
32
33
  "url": "https://bitbucket.org/mimiktech/sumologic-winston-logger"
33
34
  },
34
35
  "dependencies": {
35
- "@mimik/lib-filters": "^1.5.4",
36
- "@aws-sdk/client-s3": "3.665.0",
37
- "@aws-sdk/client-kinesis": "3.665.0",
38
- "axios": "1.7.7",
36
+ "@mimik/lib-filters": "^2.0.1",
37
+ "@aws-sdk/client-s3": "3.758.0",
38
+ "@aws-sdk/client-kinesis": "3.758.0",
39
+ "axios": "1.8.1",
39
40
  "bluebird": "3.7.2",
40
41
  "lodash.difference": "4.5.0",
41
42
  "lodash.foreach": "4.5.0",
@@ -47,28 +48,25 @@
47
48
  "lodash.split": "4.4.2",
48
49
  "lodash.trim": "4.5.1",
49
50
  "lodash.trimstart": "4.5.1",
50
- "winston": "3.14.2",
51
- "winston-transport": "4.8.0"
51
+ "winston": "3.17.0",
52
+ "winston-transport": "4.9.0"
52
53
  },
53
54
  "devDependencies": {
54
- "@mimik/eslint-plugin-dependencies": "^2.4.6",
55
- "@mimik/eslint-plugin-document-env": "^1.0.6",
56
- "@mimik/request-helper": "^1.7.11",
55
+ "@eslint/js": "9.21.0",
56
+ "@mimik/eslint-plugin-document-env": "^2.0.2",
57
+ "@mimik/request-helper": "^2.0.0",
58
+ "@stylistic/eslint-plugin": "4.2.0",
57
59
  "body-parser": "1.20.3",
58
- "chai": "4.5.0",
59
- "eslint": "8.57.1",
60
- "eslint-config-airbnb": "19.0.4",
60
+ "c8": "10.1.3",
61
+ "chai": "5.2.0",
62
+ "eslint": "9.21.0",
61
63
  "eslint-plugin-import": "2.31.0",
62
- "eslint-plugin-jsx-a11y": "6.10.0",
63
- "eslint-plugin-react": "7.37.1",
64
- "eslint-plugin-react-hooks": "4.6.2",
65
- "express": "4.21.0",
66
- "husky": "9.1.6",
67
- "jsdoc-to-markdown": "9.0.2",
68
- "lodash": "4.17.21",
69
- "mocha": "10.7.3",
64
+ "express": "4.21.2",
65
+ "husky": "9.1.7",
66
+ "jsdoc-to-markdown": "9.1.1",
67
+ "lodash.clone": "4.5.0",
68
+ "mocha": "11.1.0",
70
69
  "mochawesome": "7.1.3",
71
- "nyc": "17.1.0",
72
70
  "sinon": "19.0.2",
73
71
  "supertest": "7.0.0"
74
72
  }
@@ -1,20 +1,5 @@
1
1
  [
2
- "*.firsName",
3
- "*.lastName",
4
- "*.password",
5
- "*.email",
6
- "*.access_token",
7
- "*.refresh_token",
8
- "*.secret",
9
- "*.accessKey",
10
- "*.refreshKey",
11
- "*.Token",
12
- "*.NewPassword",
13
- "*.ConfirmPassword",
14
- "*.sumologicCode",
15
- "*.accessKey",
16
- "*.admin.id",
17
- "*.server.id",
18
- "*.key",
19
- "*.user"
2
+ "$..references[0]",
3
+ "$..references[1].serverType",
4
+ "$..email"
20
5
  ]