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

Commit

Permalink
Merge pull request #43 from AckeeCZ/refactor/more-formatters
Browse files Browse the repository at this point in the history
✨ Use pino formatters for pkgVersion and severity
  • Loading branch information
vlasy committed Jun 16, 2020
2 parents 1f622f5 + 6dce7fa commit 221ed17
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 20 deletions.
27 changes: 22 additions & 5 deletions src/index.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import { ErrorRequestHandler } from 'express';
import * as fs from 'fs';
import isObject = require('lodash.isobject');
import isString = require('lodash.isstring');
import * as path from 'path';
import * as pino from 'pino';
import * as pinoms from 'pino-multi-stream';
import { Writable } from 'stream';
Expand Down Expand Up @@ -48,7 +50,7 @@ const objEmpty = (obj: object) => Object.keys(obj).length === 0;

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

const initFormatters = (options: CosmasOptions & { loggerName?: string }) => {
const pkgJson = JSON.parse(fs.readFileSync(path.resolve(path.join(__dirname, '..', 'package.json')), 'utf8'));

const formatters: pino.LoggerOptions['formatters'] = {};
if (options.pretty || options.disableStackdriverFormat) return formatters;
formatters.level = (_label: string, level: number) => {
return { level, severity: PINO_TO_STACKDRIVER[level] || 'UNKNOWN' };
if (!options.pretty && !options.disableStackdriverFormat) {
formatters.level = (_label: string, level: number) => {
return { level, severity: PINO_TO_STACKDRIVER[level] || 'UNKNOWN' };
};
}

// do not put logger name field to pretty outputs
formatters.log = (object: { [key: string]: any }) => {
if (options.pretty) return object;

// put pkgVersion to non-pretty outputs
object[pkgVersionKey] = pkgJson.version;
if (options.loggerName) {
object[loggerNameKey] = options.loggerName;
}
return object;
};
return formatters;
};
Expand All @@ -89,7 +106,7 @@ const initHooks = (options: CosmasOptions & { loggerName?: string }) => {
if (!options.loggerName) return hooks;

// always put logger name to message
hooks.logMethod = function(inputArgs, method) {
hooks.logMethod = function (inputArgs, method) {
const text = inputArgs[inputArgs.length - 1];
if (typeof text === 'string' || text instanceof String) {
inputArgs[inputArgs.length - 1] = `[${options.loggerName}] ${text}`;
Expand Down
12 changes: 0 additions & 12 deletions src/streams.ts
Original file line number Diff line number Diff line change
@@ -1,31 +1,19 @@
import * as fs from 'fs';
import * as path from 'path';
import * as pino from 'pino';
import { Transform, TransformCallback } from 'stream';
import * as util from 'util';
import { loggerNameKey, pkgVersionKey } from './index';
import { CosmasOptions, CosmasStream } from './interfaces';
import { levels } from './levels';

const pkgJson = JSON.parse(fs.readFileSync(path.resolve(path.join(__dirname, '..', 'package.json')), 'utf8'));

const getDefaultTransformStream = (options: CosmasOptions & { messageKey: string; loggerName?: string }) => {
class DefaultTransformStream extends Transform {
// tslint:disable-next-line:function-name
public _transform(chunk: any, _encoding: string, callback: TransformCallback) {
const obj = JSON.parse(chunk);
const loggerName = options.loggerName;
let res;
if (loggerName && !options.pretty) {
// do not put logger name field to pretty outputs
obj[loggerNameKey] = loggerName;
}

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

Expand Down
8 changes: 5 additions & 3 deletions src/tests/sentry-mocked.test.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import omit = require('omit-deep');
import { levels } from '../levels';

let loggerFactory;
const scope: any = {};
const withScope = jest.fn(fn =>
const withScope = jest.fn((fn) =>
fn({
setContext: (key: string, val: any) => {
scope.context = { [key]: val };
Expand All @@ -16,7 +17,7 @@ const withScope = jest.fn(fn =>
})
);

const createCapture = (cb = () => {}) => data => {
const createCapture = (cb = () => {}) => (data) => {
cb();
return { data, scope };
};
Expand Down Expand Up @@ -86,7 +87,8 @@ describe('sentry mocked', () => {
"fatal",
]
`);
expect(captureMessage.mock.results[0].value).toMatchInlineSnapshot(`
expect(captureMessage.mock.results[0].value.scope.extras['cosmas.pkgVersion']).toBeDefined();
expect(omit(captureMessage.mock.results[0].value, 'cosmas.pkgVersion')).toMatchInlineSnapshot(`
Object {
"data": "fatal",
"scope": Object {
Expand Down

0 comments on commit 221ed17

Please sign in to comment.