mynth-logger 1.0.13 → 1.1.1
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/.eslintignore +1 -0
- package/.eslintrc.json +69 -0
- package/.github/workflows/CI.yaml +42 -12
- package/.github/workflows/npm-publish.yml +16 -3
- package/dist/src/datadog-stdout.d.ts +6 -0
- package/dist/src/datadog-stdout.js +52 -0
- package/dist/src/index.d.ts +1 -4
- package/dist/src/index.js +3 -79
- package/dist/src/logging.d.ts +6 -0
- package/dist/src/logging.js +67 -0
- package/dist/src/run.d.ts +1 -0
- package/dist/src/run.js +10 -0
- package/dist/tests/index.test.js +11 -15
- package/package.json +10 -12
- package/src/datadog-stdout.ts +33 -0
- package/src/index.ts +1 -78
- package/src/logging.ts +79 -0
- package/src/run.ts +10 -0
- package/tests/index.test.ts +14 -16
package/.eslintignore
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
dist
|
package/.eslintrc.json
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
{
|
|
2
|
+
"parser": "@typescript-eslint/parser",
|
|
3
|
+
"extends": [
|
|
4
|
+
"eslint:recommended",
|
|
5
|
+
"plugin:ava/recommended",
|
|
6
|
+
"plugin:@typescript-eslint/recommended",
|
|
7
|
+
"plugin:import/errors",
|
|
8
|
+
"plugin:import/warnings",
|
|
9
|
+
"plugin:import/typescript"
|
|
10
|
+
],
|
|
11
|
+
"plugins": [
|
|
12
|
+
"ava",
|
|
13
|
+
"import",
|
|
14
|
+
"@typescript-eslint",
|
|
15
|
+
"file-extension-in-import-ts"
|
|
16
|
+
],
|
|
17
|
+
"settings": {
|
|
18
|
+
"import/resolver": {
|
|
19
|
+
"node": {
|
|
20
|
+
"paths": ["src"]
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
"rules": {
|
|
25
|
+
"padding-line-between-statements": [
|
|
26
|
+
"error",
|
|
27
|
+
{ "blankLine": "always", "prev": "*", "next": "block" },
|
|
28
|
+
{ "blankLine": "always", "prev": "block", "next": "*" },
|
|
29
|
+
{ "blankLine": "always", "prev": "*", "next": "block-like" },
|
|
30
|
+
{ "blankLine": "always", "prev": "block-like", "next": "*" }
|
|
31
|
+
],
|
|
32
|
+
"@typescript-eslint/no-unused-vars": [
|
|
33
|
+
"warn",
|
|
34
|
+
{
|
|
35
|
+
"argsIgnorePattern": "^_",
|
|
36
|
+
"varsIgnorePattern": "^_",
|
|
37
|
+
"caughtErrorsIgnorePattern": "^_"
|
|
38
|
+
}
|
|
39
|
+
],
|
|
40
|
+
"@typescript-eslint/naming-convention": [
|
|
41
|
+
"error",
|
|
42
|
+
{
|
|
43
|
+
"selector": ["parameter", "variable"],
|
|
44
|
+
"leadingUnderscore": "forbid",
|
|
45
|
+
"format": null
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"selector": "parameter",
|
|
49
|
+
"leadingUnderscore": "require",
|
|
50
|
+
"format": null,
|
|
51
|
+
"modifiers": ["unused"]
|
|
52
|
+
}
|
|
53
|
+
],
|
|
54
|
+
"no-constant-condition": "off",
|
|
55
|
+
"file-extension-in-import-ts/file-extension-in-import-ts": "error",
|
|
56
|
+
"import/no-unresolved": ["error", { "ignore": ["\\.js$"] }],
|
|
57
|
+
"no-restricted-imports": ["error", { "patterns": ["src/*"] }]
|
|
58
|
+
},
|
|
59
|
+
"overrides": [
|
|
60
|
+
{
|
|
61
|
+
"files": ["tests/**/*.ts"],
|
|
62
|
+
"rules": {
|
|
63
|
+
"import/no-unresolved": "off",
|
|
64
|
+
"file-extension-in-import-ts/file-extension-in-import-ts": "off",
|
|
65
|
+
"ava/no-ignored-test-files": "off"
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
]
|
|
69
|
+
}
|
|
@@ -17,10 +17,11 @@ jobs:
|
|
|
17
17
|
- name: Set up Node.js
|
|
18
18
|
uses: actions/setup-node@v3
|
|
19
19
|
with:
|
|
20
|
-
node-version: 18
|
|
20
|
+
node-version: 18
|
|
21
|
+
check-latest: true
|
|
21
22
|
|
|
22
23
|
- name: Update npm
|
|
23
|
-
run: npm install -g npm@
|
|
24
|
+
run: npm install -g npm@latest
|
|
24
25
|
|
|
25
26
|
- name: Install dependencies
|
|
26
27
|
run: npm ci --include dev
|
|
@@ -28,26 +29,51 @@ jobs:
|
|
|
28
29
|
- name: Run tests
|
|
29
30
|
run: npm run test
|
|
30
31
|
|
|
31
|
-
|
|
32
|
+
test-pretty:
|
|
32
33
|
runs-on: ubuntu-latest
|
|
33
34
|
timeout-minutes: 10
|
|
35
|
+
steps:
|
|
36
|
+
- name: Checkout repository
|
|
37
|
+
uses: actions/checkout@v3
|
|
38
|
+
|
|
39
|
+
- name: Set up Node.js
|
|
40
|
+
uses: actions/setup-node@v3
|
|
41
|
+
with:
|
|
42
|
+
node-version: 18
|
|
43
|
+
check-latest: true
|
|
34
44
|
|
|
45
|
+
- name: Update npm
|
|
46
|
+
run: npm install -g npm@latest
|
|
47
|
+
|
|
48
|
+
- name: Install dependencies
|
|
49
|
+
run: npm ci --include dev
|
|
50
|
+
|
|
51
|
+
- name: Run tests
|
|
52
|
+
run: npm run test:pretty
|
|
53
|
+
|
|
54
|
+
test-run:
|
|
55
|
+
runs-on: ubuntu-latest
|
|
56
|
+
timeout-minutes: 10
|
|
35
57
|
steps:
|
|
36
|
-
- name: Checkout
|
|
58
|
+
- name: Checkout repository
|
|
37
59
|
uses: actions/checkout@v3
|
|
38
60
|
|
|
39
61
|
- name: Set up Node.js
|
|
40
62
|
uses: actions/setup-node@v3
|
|
41
63
|
with:
|
|
42
|
-
node-version: 18
|
|
64
|
+
node-version: 18
|
|
65
|
+
check-latest: true
|
|
66
|
+
|
|
67
|
+
- name: Update npm
|
|
68
|
+
run: npm install -g npm@latest
|
|
43
69
|
|
|
44
70
|
- name: Install dependencies
|
|
45
|
-
run: npm
|
|
71
|
+
run: npm ci --include dev
|
|
46
72
|
|
|
47
|
-
- name:
|
|
48
|
-
run: npm run
|
|
73
|
+
- name: Run tests
|
|
74
|
+
run: npm run logs
|
|
49
75
|
|
|
50
|
-
|
|
76
|
+
lint:
|
|
51
77
|
runs-on: ubuntu-latest
|
|
52
78
|
timeout-minutes: 10
|
|
53
79
|
|
|
@@ -58,10 +84,14 @@ jobs:
|
|
|
58
84
|
- name: Set up Node.js
|
|
59
85
|
uses: actions/setup-node@v3
|
|
60
86
|
with:
|
|
61
|
-
node-version: 18
|
|
87
|
+
node-version: 18
|
|
88
|
+
check-latest: true
|
|
89
|
+
|
|
90
|
+
- name: Update npm
|
|
91
|
+
run: npm install -g npm@latest
|
|
62
92
|
|
|
63
93
|
- name: Install dependencies
|
|
64
94
|
run: npm install --include dev
|
|
65
95
|
|
|
66
|
-
- name:
|
|
67
|
-
run: npm run
|
|
96
|
+
- name: Lint
|
|
97
|
+
run: npm run lint
|
|
@@ -16,21 +16,34 @@ jobs:
|
|
|
16
16
|
ref: ${{ github.head_ref }}
|
|
17
17
|
fetch-depth: 0
|
|
18
18
|
token: ${{ secrets.PAT }}
|
|
19
|
+
|
|
19
20
|
- uses: actions/setup-node@v3
|
|
20
21
|
with:
|
|
21
|
-
node-version: 18
|
|
22
|
+
node-version: 18
|
|
23
|
+
check-latest: true
|
|
22
24
|
registry-url: https://registry.npmjs.org/
|
|
23
|
-
|
|
24
|
-
-
|
|
25
|
+
|
|
26
|
+
- name: Update npm
|
|
27
|
+
run: npm install -g npm@latest
|
|
28
|
+
|
|
29
|
+
- name: Install dependencies
|
|
30
|
+
run: npm ci --include dev
|
|
31
|
+
|
|
32
|
+
- name: Build
|
|
33
|
+
run: npm run build
|
|
34
|
+
|
|
25
35
|
- name: Git configuration
|
|
26
36
|
run: |
|
|
27
37
|
git config --local user.email "github-actions[bot]@users.noreply.github.com"
|
|
28
38
|
git config --local user.name "github-actions[bot]"
|
|
39
|
+
|
|
29
40
|
- run: npm version --commit-hooks true patch
|
|
41
|
+
|
|
30
42
|
- name: Git commit and push
|
|
31
43
|
env:
|
|
32
44
|
GITHUB_TOKEN: ${{ secrets.PAT }}
|
|
33
45
|
run: git push origin
|
|
46
|
+
|
|
34
47
|
- run: npm publish
|
|
35
48
|
env:
|
|
36
49
|
NODE_AUTH_TOKEN: ${{ secrets.NPM_AUTH_TOKEN }}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
|
+
};
|
|
28
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
+
const pino_abstract_transport_1 = __importDefault(require("pino-abstract-transport"));
|
|
30
|
+
const loadPretty = async () => {
|
|
31
|
+
try {
|
|
32
|
+
return await Promise.resolve().then(() => __importStar(require("pino-pretty")));
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
const transport = async (opts) => {
|
|
39
|
+
if (!opts || opts.pretty !== false) {
|
|
40
|
+
const pretty = await loadPretty();
|
|
41
|
+
if (pretty)
|
|
42
|
+
return pretty.default({ colorize: true, ignore: "pid,time,hostname" });
|
|
43
|
+
}
|
|
44
|
+
return (0, pino_abstract_transport_1.default)(async (source) => {
|
|
45
|
+
for await (const log of source) {
|
|
46
|
+
const level = "level" in log ? String(log.level) : "error";
|
|
47
|
+
const msg = "msg" in log ? String(log.msg) : String(log);
|
|
48
|
+
process.stdout.write(`${JSON.stringify({ level, msg })}\n`);
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
};
|
|
52
|
+
exports.default = transport;
|
package/dist/src/index.d.ts
CHANGED
package/dist/src/index.js
CHANGED
|
@@ -10,84 +10,8 @@ var __createBinding = (this && this.__createBinding) || (Object.create ? (functi
|
|
|
10
10
|
if (k2 === undefined) k2 = k;
|
|
11
11
|
o[k2] = m[k];
|
|
12
12
|
}));
|
|
13
|
-
var
|
|
14
|
-
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
-
if (mod && mod.__esModule) return mod;
|
|
20
|
-
var result = {};
|
|
21
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
-
__setModuleDefault(result, mod);
|
|
23
|
-
return result;
|
|
24
|
-
};
|
|
25
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
27
15
|
};
|
|
28
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
-
|
|
30
|
-
const pino_1 = __importDefault(require("pino"));
|
|
31
|
-
const pinoSettings = {
|
|
32
|
-
base: undefined,
|
|
33
|
-
timestamp: false,
|
|
34
|
-
level: "debug",
|
|
35
|
-
formatters: {
|
|
36
|
-
level(level) {
|
|
37
|
-
return { level };
|
|
38
|
-
},
|
|
39
|
-
},
|
|
40
|
-
};
|
|
41
|
-
exports.pinoSettings = pinoSettings;
|
|
42
|
-
const formatItem = (item) => {
|
|
43
|
-
if (typeof item === "undefined") {
|
|
44
|
-
return "undefined";
|
|
45
|
-
}
|
|
46
|
-
// Remove colors from strings
|
|
47
|
-
if (typeof item === "string") {
|
|
48
|
-
return item.replace(/\x1b\[[0-9;]*m/g, "");
|
|
49
|
-
}
|
|
50
|
-
let stringified = "";
|
|
51
|
-
try {
|
|
52
|
-
stringified = JSON.stringify(item) || String(item);
|
|
53
|
-
}
|
|
54
|
-
catch {
|
|
55
|
-
stringified = String(item);
|
|
56
|
-
}
|
|
57
|
-
return stringified.replace(/^\'|\'$/g, "");
|
|
58
|
-
};
|
|
59
|
-
const format = (items) => {
|
|
60
|
-
return Array.from(items)
|
|
61
|
-
.map((item) => formatItem(item))
|
|
62
|
-
.join(" ");
|
|
63
|
-
};
|
|
64
|
-
const overrideConsole = (logger) => {
|
|
65
|
-
console.log = function () {
|
|
66
|
-
logger.info(format(Array.from(arguments)));
|
|
67
|
-
};
|
|
68
|
-
console.info = function () {
|
|
69
|
-
logger.info(format(Array.from(arguments)));
|
|
70
|
-
};
|
|
71
|
-
console.warn = function () {
|
|
72
|
-
logger.warn(format(Array.from(arguments)));
|
|
73
|
-
};
|
|
74
|
-
console.error = function () {
|
|
75
|
-
logger.error(format(Array.from(arguments)));
|
|
76
|
-
};
|
|
77
|
-
console.debug = function () {
|
|
78
|
-
logger.debug(format(Array.from(arguments)));
|
|
79
|
-
};
|
|
80
|
-
};
|
|
81
|
-
const setupLogging = async (settings = pinoSettings) => {
|
|
82
|
-
let pretty;
|
|
83
|
-
try {
|
|
84
|
-
pretty = await Promise.resolve().then(() => __importStar(require("pino-pretty")));
|
|
85
|
-
}
|
|
86
|
-
catch { }
|
|
87
|
-
const logger = pretty
|
|
88
|
-
? (0, pino_1.default)(settings, pretty.default({ colorize: true }))
|
|
89
|
-
: (0, pino_1.default)(settings);
|
|
90
|
-
typeof window === "undefined" && overrideConsole(logger);
|
|
91
|
-
return logger;
|
|
92
|
-
};
|
|
93
|
-
exports.setupLogging = setupLogging;
|
|
17
|
+
__exportStar(require("./logging.js"), exports);
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.setupLogging = void 0;
|
|
7
|
+
const pino_1 = __importDefault(require("pino"));
|
|
8
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
9
|
+
const formatItem = (item) => {
|
|
10
|
+
if (typeof item === "undefined") {
|
|
11
|
+
return "undefined";
|
|
12
|
+
}
|
|
13
|
+
// Remove colors from strings
|
|
14
|
+
if (typeof item === "string") {
|
|
15
|
+
// eslint-disable-next-line no-control-regex
|
|
16
|
+
return item.replace(/\x1b\[[0-9;]*m/g, "");
|
|
17
|
+
}
|
|
18
|
+
let stringified = "";
|
|
19
|
+
try {
|
|
20
|
+
stringified = JSON.stringify(item) || String(item);
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
stringified = String(item);
|
|
24
|
+
}
|
|
25
|
+
return stringified.replace(/^'|'$/g, "");
|
|
26
|
+
};
|
|
27
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
28
|
+
const format = (items) => {
|
|
29
|
+
return Array.from(items)
|
|
30
|
+
.map((item) => formatItem(item))
|
|
31
|
+
.join(" ");
|
|
32
|
+
};
|
|
33
|
+
const overrideConsole = (logger) => {
|
|
34
|
+
console.log = function (...args) {
|
|
35
|
+
logger.info(format(Array.from(args)));
|
|
36
|
+
};
|
|
37
|
+
console.info = function (...args) {
|
|
38
|
+
logger.info(format(Array.from(args)));
|
|
39
|
+
};
|
|
40
|
+
console.warn = function (...args) {
|
|
41
|
+
logger.warn(format(Array.from(args)));
|
|
42
|
+
};
|
|
43
|
+
console.error = function (...args) {
|
|
44
|
+
logger.error(format(Array.from(args)));
|
|
45
|
+
};
|
|
46
|
+
console.debug = function (...args) {
|
|
47
|
+
logger.debug(format(Array.from(args)));
|
|
48
|
+
};
|
|
49
|
+
};
|
|
50
|
+
const setupLogging = (pretty = true) => {
|
|
51
|
+
const transport = pino_1.default.transport({
|
|
52
|
+
targets: [
|
|
53
|
+
{
|
|
54
|
+
target: "./datadog-stdout.js",
|
|
55
|
+
level: "debug",
|
|
56
|
+
options: { pretty },
|
|
57
|
+
},
|
|
58
|
+
],
|
|
59
|
+
});
|
|
60
|
+
const logger = (0, pino_1.default)({ level: "debug" }, transport);
|
|
61
|
+
logger.untilFinished = new Promise((resolve) => {
|
|
62
|
+
transport.on("ready", resolve);
|
|
63
|
+
});
|
|
64
|
+
typeof window === "undefined" && overrideConsole(logger);
|
|
65
|
+
return logger;
|
|
66
|
+
};
|
|
67
|
+
exports.setupLogging = setupLogging;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/dist/src/run.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const index_js_1 = require("./index.js");
|
|
4
|
+
const run = (prettify = true) => {
|
|
5
|
+
(0, index_js_1.setupLogging)(prettify);
|
|
6
|
+
console.debug("hello world");
|
|
7
|
+
};
|
|
8
|
+
run();
|
|
9
|
+
// Use `run(false)` to disable pino-pretty
|
|
10
|
+
// pino-pretty will also be disabled if it's not installed
|
package/dist/tests/index.test.js
CHANGED
|
@@ -5,29 +5,25 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
const ava_1 = __importDefault(require("ava"));
|
|
7
7
|
const index_1 = require("../src/index");
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
8
|
+
let logger;
|
|
9
|
+
const sleep = (ms) => {
|
|
10
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
11
|
+
};
|
|
12
|
+
ava_1.default.before(() => {
|
|
13
|
+
logger = (0, index_1.setupLogging)("TEST_PRETTY" in process.env);
|
|
13
14
|
});
|
|
14
|
-
ava_1.default.
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
18
|
-
console.debug("Hello ava, I'm pretty");
|
|
19
|
-
t.pass();
|
|
15
|
+
ava_1.default.afterEach(async () => {
|
|
16
|
+
await sleep(100);
|
|
17
|
+
logger && (await logger.untilFinished);
|
|
20
18
|
});
|
|
21
|
-
ava_1.default.serial("
|
|
22
|
-
|
|
23
|
-
console.debug("Hello ava, I'm pretty too");
|
|
19
|
+
ava_1.default.serial("logs display to terminal", (t) => {
|
|
20
|
+
console.debug("Hello ava");
|
|
24
21
|
t.pass();
|
|
25
22
|
});
|
|
26
23
|
ava_1.default.serial("can log various objects", (t) => {
|
|
27
24
|
console.debug("Message", { message: true });
|
|
28
25
|
console.debug(undefined);
|
|
29
26
|
console.debug("bigint", 100n);
|
|
30
|
-
console.debug("settings", index_1.pinoSettings);
|
|
31
27
|
console.debug(false, true, "true", "false");
|
|
32
28
|
t.pass();
|
|
33
29
|
});
|
package/package.json
CHANGED
|
@@ -1,29 +1,33 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mynth-logger",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.1",
|
|
4
4
|
"description": "Package to format logs for mynth microservices.",
|
|
5
5
|
"main": "dist/src/index.js",
|
|
6
6
|
"typings": "dist/src/index.d.ts",
|
|
7
7
|
"scripts": {
|
|
8
|
-
"test": "npx ava",
|
|
9
8
|
"build": "npx tsc",
|
|
9
|
+
"test": "npx tsc && npx ava",
|
|
10
|
+
"test:pretty": "npx tsc && TEST_PRETTY=true npx ava",
|
|
11
|
+
"logs": "npx tsc && node dist/src/run.js",
|
|
10
12
|
"prettier": "npx prettier -w '**/*.{js,jsx,ts,tsx,json,yml.j2,yml,yaml,.*}'",
|
|
11
|
-
"lint": "concurrently \"npx prettier --check '**/*.{js,jsx,ts,tsx,json,yml.j2,yml,yaml,.*}'\" \"npx eslint --max-warnings=0\""
|
|
13
|
+
"lint": "concurrently \"npx prettier --check '**/*.{js,jsx,ts,tsx,json,yml.j2,yml,yaml,.*}'\" \"npx eslint . --max-warnings=0\""
|
|
12
14
|
},
|
|
13
15
|
"repository": {
|
|
14
16
|
"type": "git",
|
|
15
17
|
"url": "git@github.com-mynth:MynthAI/mynth-logger.git"
|
|
16
18
|
},
|
|
17
19
|
"dependencies": {
|
|
18
|
-
"ava": "^5.3.1",
|
|
19
|
-
"json5": "^2.2.3",
|
|
20
20
|
"pino": "^8.15.0"
|
|
21
21
|
},
|
|
22
22
|
"devDependencies": {
|
|
23
23
|
"@types/node": "^20.5.0",
|
|
24
|
+
"@typescript-eslint/eslint-plugin": "^6.8.0",
|
|
25
|
+
"ava": "^5.3.1",
|
|
24
26
|
"concurrently": "^8.2.0",
|
|
25
27
|
"eslint": "^8.47.0",
|
|
26
28
|
"eslint-plugin-ava": "^14.0.0",
|
|
29
|
+
"eslint-plugin-file-extension-in-import-ts": "^1.0.2",
|
|
30
|
+
"eslint-plugin-import": "^2.28.1",
|
|
27
31
|
"pino-pretty": "^10.2.0",
|
|
28
32
|
"prettier": "^3.0.2",
|
|
29
33
|
"tsx": "^3.12.7",
|
|
@@ -31,13 +35,7 @@
|
|
|
31
35
|
},
|
|
32
36
|
"ava": {
|
|
33
37
|
"files": [
|
|
34
|
-
"tests/**/*.test.
|
|
35
|
-
],
|
|
36
|
-
"extensions": {
|
|
37
|
-
"ts": "module"
|
|
38
|
-
},
|
|
39
|
-
"nodeArguments": [
|
|
40
|
-
"--loader=tsx"
|
|
38
|
+
"dist/tests/**/*.test.js"
|
|
41
39
|
]
|
|
42
40
|
}
|
|
43
41
|
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import build from "pino-abstract-transport";
|
|
2
|
+
import { DestinationStream } from "pino";
|
|
3
|
+
|
|
4
|
+
type Options = {
|
|
5
|
+
pretty: boolean;
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
const loadPretty = async () => {
|
|
9
|
+
try {
|
|
10
|
+
return await import("pino-pretty");
|
|
11
|
+
} catch {
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
const transport = async (opts?: Options): Promise<DestinationStream> => {
|
|
17
|
+
if (!opts || opts.pretty !== false) {
|
|
18
|
+
const pretty = await loadPretty();
|
|
19
|
+
if (pretty)
|
|
20
|
+
return pretty.default({ colorize: true, ignore: "pid,time,hostname" });
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
return build(async (source: AsyncIterable<object>) => {
|
|
24
|
+
for await (const log of source) {
|
|
25
|
+
const level = "level" in log ? String(log.level) : "error";
|
|
26
|
+
const msg = "msg" in log ? String(log.msg) : String(log);
|
|
27
|
+
|
|
28
|
+
process.stdout.write(`${JSON.stringify({ level, msg })}\n`);
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
export default transport;
|
package/src/index.ts
CHANGED
|
@@ -1,78 +1 @@
|
|
|
1
|
-
|
|
2
|
-
import pino, { Logger, LoggerOptions } from "pino";
|
|
3
|
-
|
|
4
|
-
const pinoSettings: LoggerOptions = {
|
|
5
|
-
base: undefined,
|
|
6
|
-
timestamp: false,
|
|
7
|
-
level: "debug",
|
|
8
|
-
formatters: {
|
|
9
|
-
level(level) {
|
|
10
|
-
return { level };
|
|
11
|
-
},
|
|
12
|
-
},
|
|
13
|
-
};
|
|
14
|
-
|
|
15
|
-
const formatItem = (item: any): string => {
|
|
16
|
-
if (typeof item === "undefined") {
|
|
17
|
-
return "undefined";
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
// Remove colors from strings
|
|
21
|
-
if (typeof item === "string") {
|
|
22
|
-
return item.replace(/\x1b\[[0-9;]*m/g, "");
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
let stringified = "";
|
|
26
|
-
try {
|
|
27
|
-
stringified = JSON.stringify(item) || String(item);
|
|
28
|
-
} catch {
|
|
29
|
-
stringified = String(item);
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
return stringified.replace(/^\'|\'$/g, "");
|
|
33
|
-
};
|
|
34
|
-
|
|
35
|
-
const format = (items: any[]): string => {
|
|
36
|
-
return Array.from(items)
|
|
37
|
-
.map((item) => formatItem(item))
|
|
38
|
-
.join(" ");
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
const overrideConsole = (logger: Logger) => {
|
|
42
|
-
console.log = function () {
|
|
43
|
-
logger.info(format(Array.from(arguments)));
|
|
44
|
-
};
|
|
45
|
-
|
|
46
|
-
console.info = function () {
|
|
47
|
-
logger.info(format(Array.from(arguments)));
|
|
48
|
-
};
|
|
49
|
-
|
|
50
|
-
console.warn = function () {
|
|
51
|
-
logger.warn(format(Array.from(arguments)));
|
|
52
|
-
};
|
|
53
|
-
|
|
54
|
-
console.error = function () {
|
|
55
|
-
logger.error(format(Array.from(arguments)));
|
|
56
|
-
};
|
|
57
|
-
|
|
58
|
-
console.debug = function () {
|
|
59
|
-
logger.debug(format(Array.from(arguments)));
|
|
60
|
-
};
|
|
61
|
-
};
|
|
62
|
-
|
|
63
|
-
const setupLogging = async (
|
|
64
|
-
settings: LoggerOptions = pinoSettings
|
|
65
|
-
): Promise<Logger> => {
|
|
66
|
-
let pretty;
|
|
67
|
-
try {
|
|
68
|
-
pretty = await import("pino-pretty");
|
|
69
|
-
} catch {}
|
|
70
|
-
|
|
71
|
-
const logger = pretty
|
|
72
|
-
? pino(settings, pretty.default({ colorize: true }))
|
|
73
|
-
: pino(settings);
|
|
74
|
-
typeof window === "undefined" && overrideConsole(logger);
|
|
75
|
-
return logger;
|
|
76
|
-
};
|
|
77
|
-
|
|
78
|
-
export { pinoSettings, setupLogging };
|
|
1
|
+
export * from "./logging.js";
|
package/src/logging.ts
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import pino, { Logger } from "pino";
|
|
2
|
+
|
|
3
|
+
type AwaitableLogger = Logger & {
|
|
4
|
+
untilFinished: Promise<void>;
|
|
5
|
+
};
|
|
6
|
+
|
|
7
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
8
|
+
const formatItem = (item: any): string => {
|
|
9
|
+
if (typeof item === "undefined") {
|
|
10
|
+
return "undefined";
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
// Remove colors from strings
|
|
14
|
+
if (typeof item === "string") {
|
|
15
|
+
// eslint-disable-next-line no-control-regex
|
|
16
|
+
return item.replace(/\x1b\[[0-9;]*m/g, "");
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
let stringified = "";
|
|
20
|
+
|
|
21
|
+
try {
|
|
22
|
+
stringified = JSON.stringify(item) || String(item);
|
|
23
|
+
} catch {
|
|
24
|
+
stringified = String(item);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
return stringified.replace(/^'|'$/g, "");
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
31
|
+
const format = (items: any[]): string => {
|
|
32
|
+
return Array.from(items)
|
|
33
|
+
.map((item) => formatItem(item))
|
|
34
|
+
.join(" ");
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
const overrideConsole = (logger: Logger) => {
|
|
38
|
+
console.log = function (...args) {
|
|
39
|
+
logger.info(format(Array.from(args)));
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
console.info = function (...args) {
|
|
43
|
+
logger.info(format(Array.from(args)));
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
console.warn = function (...args) {
|
|
47
|
+
logger.warn(format(Array.from(args)));
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
console.error = function (...args) {
|
|
51
|
+
logger.error(format(Array.from(args)));
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
console.debug = function (...args) {
|
|
55
|
+
logger.debug(format(Array.from(args)));
|
|
56
|
+
};
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
const setupLogging = (pretty: boolean = true): AwaitableLogger => {
|
|
60
|
+
const transport = pino.transport({
|
|
61
|
+
targets: [
|
|
62
|
+
{
|
|
63
|
+
target: "./datadog-stdout.js",
|
|
64
|
+
level: "debug",
|
|
65
|
+
options: { pretty },
|
|
66
|
+
},
|
|
67
|
+
],
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
const logger = pino({ level: "debug" }, transport) as AwaitableLogger;
|
|
71
|
+
logger.untilFinished = new Promise<void>((resolve) => {
|
|
72
|
+
transport.on("ready", resolve);
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
typeof window === "undefined" && overrideConsole(logger);
|
|
76
|
+
return logger;
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
export { AwaitableLogger, setupLogging };
|
package/src/run.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { setupLogging } from "./index.js";
|
|
2
|
+
|
|
3
|
+
const run = (prettify: boolean = true) => {
|
|
4
|
+
setupLogging(prettify);
|
|
5
|
+
console.debug("hello world");
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
run();
|
|
9
|
+
// Use `run(false)` to disable pino-pretty
|
|
10
|
+
// pino-pretty will also be disabled if it's not installed
|
package/tests/index.test.ts
CHANGED
|
@@ -1,24 +1,23 @@
|
|
|
1
1
|
import test from "ava";
|
|
2
|
-
import {
|
|
3
|
-
import pino from "pino";
|
|
2
|
+
import { AwaitableLogger, setupLogging } from "../src/index";
|
|
4
3
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
4
|
+
let logger: AwaitableLogger | undefined;
|
|
5
|
+
|
|
6
|
+
const sleep = (ms: number) => {
|
|
7
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
test.before(() => {
|
|
11
|
+
logger = setupLogging("TEST_PRETTY" in process.env);
|
|
9
12
|
});
|
|
10
13
|
|
|
11
|
-
test.
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
15
|
-
console.debug("Hello ava, I'm pretty");
|
|
16
|
-
t.pass();
|
|
14
|
+
test.afterEach(async () => {
|
|
15
|
+
await sleep(100);
|
|
16
|
+
logger && (await logger.untilFinished);
|
|
17
17
|
});
|
|
18
18
|
|
|
19
|
-
test.serial("
|
|
20
|
-
|
|
21
|
-
console.debug("Hello ava, I'm pretty too");
|
|
19
|
+
test.serial("logs display to terminal", (t) => {
|
|
20
|
+
console.debug("Hello ava");
|
|
22
21
|
t.pass();
|
|
23
22
|
});
|
|
24
23
|
|
|
@@ -26,7 +25,6 @@ test.serial("can log various objects", (t) => {
|
|
|
26
25
|
console.debug("Message", { message: true });
|
|
27
26
|
console.debug(undefined);
|
|
28
27
|
console.debug("bigint", 100n);
|
|
29
|
-
console.debug("settings", pinoSettings);
|
|
30
28
|
console.debug(false, true, "true", "false");
|
|
31
29
|
t.pass();
|
|
32
30
|
});
|