Skip to content
This repository was archived by the owner on Jun 21, 2023. It is now read-only.

Commit 221ed17

Browse files
authored
Merge pull request #43 from AckeeCZ/refactor/more-formatters
✨ Use pino formatters for pkgVersion and severity
2 parents 1f622f5 + 6dce7fa commit 221ed17

3 files changed

Lines changed: 27 additions & 20 deletions

File tree

src/index.ts

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import { ErrorRequestHandler } from 'express';
2+
import * as fs from 'fs';
23
import isObject = require('lodash.isobject');
34
import isString = require('lodash.isstring');
5+
import * as path from 'path';
46
import * as pino from 'pino';
57
import * as pinoms from 'pino-multi-stream';
68
import { Writable } from 'stream';
@@ -48,7 +50,7 @@ const objEmpty = (obj: object) => Object.keys(obj).length === 0;
4850

4951
// This is a custom slightly edited version of pino-multistream's write method, which adds support for maximum log level
5052
// The original version was pino-multistream 4.2.0 (commit bf7941f) - https://github.com/pinojs/pino-multi-stream/blob/bf7941f77661b6c14dd40840ff4a4db6897f08eb/multistream.js#L43
51-
const maxLevelWrite: pino.WriteFn = function(this: any, data: object): void {
53+
const maxLevelWrite: pino.WriteFn = function (this: any, data: object): void {
5254
let stream;
5355
const metadata = Symbol.for('pino.metadata');
5456
const level = this.lastLevel;
@@ -76,10 +78,25 @@ const maxLevelWrite: pino.WriteFn = function(this: any, data: object): void {
7678
};
7779

7880
const initFormatters = (options: CosmasOptions & { loggerName?: string }) => {
81+
const pkgJson = JSON.parse(fs.readFileSync(path.resolve(path.join(__dirname, '..', 'package.json')), 'utf8'));
82+
7983
const formatters: pino.LoggerOptions['formatters'] = {};
80-
if (options.pretty || options.disableStackdriverFormat) return formatters;
81-
formatters.level = (_label: string, level: number) => {
82-
return { level, severity: PINO_TO_STACKDRIVER[level] || 'UNKNOWN' };
84+
if (!options.pretty && !options.disableStackdriverFormat) {
85+
formatters.level = (_label: string, level: number) => {
86+
return { level, severity: PINO_TO_STACKDRIVER[level] || 'UNKNOWN' };
87+
};
88+
}
89+
90+
// do not put logger name field to pretty outputs
91+
formatters.log = (object: { [key: string]: any }) => {
92+
if (options.pretty) return object;
93+
94+
// put pkgVersion to non-pretty outputs
95+
object[pkgVersionKey] = pkgJson.version;
96+
if (options.loggerName) {
97+
object[loggerNameKey] = options.loggerName;
98+
}
99+
return object;
83100
};
84101
return formatters;
85102
};
@@ -89,7 +106,7 @@ const initHooks = (options: CosmasOptions & { loggerName?: string }) => {
89106
if (!options.loggerName) return hooks;
90107

91108
// always put logger name to message
92-
hooks.logMethod = function(inputArgs, method) {
109+
hooks.logMethod = function (inputArgs, method) {
93110
const text = inputArgs[inputArgs.length - 1];
94111
if (typeof text === 'string' || text instanceof String) {
95112
inputArgs[inputArgs.length - 1] = `[${options.loggerName}] ${text}`;

src/streams.ts

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,19 @@
1-
import * as fs from 'fs';
2-
import * as path from 'path';
31
import * as pino from 'pino';
42
import { Transform, TransformCallback } from 'stream';
53
import * as util from 'util';
6-
import { loggerNameKey, pkgVersionKey } from './index';
74
import { CosmasOptions, CosmasStream } from './interfaces';
85
import { levels } from './levels';
96

10-
const pkgJson = JSON.parse(fs.readFileSync(path.resolve(path.join(__dirname, '..', 'package.json')), 'utf8'));
11-
127
const getDefaultTransformStream = (options: CosmasOptions & { messageKey: string; loggerName?: string }) => {
138
class DefaultTransformStream extends Transform {
149
// tslint:disable-next-line:function-name
1510
public _transform(chunk: any, _encoding: string, callback: TransformCallback) {
1611
const obj = JSON.parse(chunk);
17-
const loggerName = options.loggerName;
1812
let res;
19-
if (loggerName && !options.pretty) {
20-
// do not put logger name field to pretty outputs
21-
obj[loggerNameKey] = loggerName;
22-
}
2313

2414
if (options.pretty) {
2515
res = util.inspect(obj, { colors: true, showHidden: true, depth: Infinity });
2616
} else {
27-
// do not put pkgVersion to pretty outputs
28-
obj[pkgVersionKey] = pkgJson.version;
2917
res = JSON.stringify(obj);
3018
}
3119

src/tests/sentry-mocked.test.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1+
import omit = require('omit-deep');
12
import { levels } from '../levels';
23

34
let loggerFactory;
45
const scope: any = {};
5-
const withScope = jest.fn(fn =>
6+
const withScope = jest.fn((fn) =>
67
fn({
78
setContext: (key: string, val: any) => {
89
scope.context = { [key]: val };
@@ -16,7 +17,7 @@ const withScope = jest.fn(fn =>
1617
})
1718
);
1819

19-
const createCapture = (cb = () => {}) => data => {
20+
const createCapture = (cb = () => {}) => (data) => {
2021
cb();
2122
return { data, scope };
2223
};
@@ -86,7 +87,8 @@ describe('sentry mocked', () => {
8687
"fatal",
8788
]
8889
`);
89-
expect(captureMessage.mock.results[0].value).toMatchInlineSnapshot(`
90+
expect(captureMessage.mock.results[0].value.scope.extras['cosmas.pkgVersion']).toBeDefined();
91+
expect(omit(captureMessage.mock.results[0].value, 'cosmas.pkgVersion')).toMatchInlineSnapshot(`
9092
Object {
9193
"data": "fatal",
9294
"scope": Object {

0 commit comments

Comments
 (0)