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

Commit 078aa6f

Browse files
author
Michal Vlasák
committed
♻️ Unify logger name placement
1 parent 145c99f commit 078aa6f

3 files changed

Lines changed: 28 additions & 17 deletions

File tree

src/index.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@ export interface AckeeLoggerFactory extends AckeeLogger {
2525
(data?: string | AckeeLoggerOptions): AckeeLogger;
2626
}
2727

28+
export const loggerNameKey = 'cosmas.loggerName';
29+
export const pkgVersionKey = 'cosmas.pkgVersion';
30+
2831
const makeCallable = <T extends object, F extends (...args: any[]) => any>(obj: T, fun: F): T & F =>
2932
new Proxy(fun as any, {
3033
get: (_target, key) => (obj as any)[key],
@@ -67,7 +70,7 @@ const defaultLogger = (options: AckeeLoggerOptions & { loggerName?: string } = {
6770

6871
const isTesting = process.env.NODE_ENV === 'test';
6972
const defaultLevel: Level = options.defaultLevel || (isTesting ? 'silent' : 'debug');
70-
const messageKey = options.pretty ? 'msg' : 'message'; // "message" is the best option for Google Stackdriver,
73+
const messageKey = 'message'; // best option for Google Stackdriver,
7174
const streams = initLoggerStreams(defaultLevel, Object.assign({}, options, { messageKey }));
7275

7376
options.ignoredHttpMethods = options.ignoredHttpMethods || ['OPTIONS'];

src/streams.ts

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,11 @@ import * as path from 'path';
33
import * as pino from 'pino';
44
import { Transform, TransformCallback } from 'stream';
55
import * as util from 'util';
6+
import { loggerNameKey, pkgVersionKey } from '.';
67
import { AckeeLoggerOptions, AckeeLoggerStream } from './interfaces';
78
import { levels } from './levels';
89
import { StackDriverFormatStream } from './stackdriver';
910

10-
const isString = (x: any) => typeof x === 'string' || x instanceof String;
11-
1211
const pkgJson = JSON.parse(fs.readFileSync(path.resolve(path.join(__dirname, '..', 'package.json')), 'utf8'));
1312

1413
const getDefaultTransformStream = (options: AckeeLoggerOptions & { messageKey: string; loggerName?: string }) => {
@@ -18,18 +17,20 @@ const getDefaultTransformStream = (options: AckeeLoggerOptions & { messageKey: s
1817
const obj = JSON.parse(chunk);
1918
const loggerName = options.loggerName;
2019
let res;
20+
if (loggerName) {
21+
// always put logger name to message
22+
obj[options.messageKey] = `[${loggerName}] ${obj[options.messageKey]}`;
23+
}
24+
if (loggerName && !options.pretty) {
25+
// do not put logger name field to pretty outputs
26+
obj[loggerNameKey] = loggerName;
27+
}
28+
2129
if (options.pretty) {
22-
// obj['name\0'] = obj.name; // add null character so that it is not interpreted by pino-pretty but still visible to user unchanged
23-
delete obj.name;
24-
if (loggerName) {
25-
obj.name = loggerName;
26-
}
2730
res = util.inspect(obj, { colors: true, showHidden: true, depth: 10 });
2831
} else {
29-
obj.pkgVersion = pkgJson.version;
30-
if (obj[options.messageKey] && isString(obj[options.messageKey]) && loggerName) {
31-
obj[options.messageKey] = `[${loggerName}] ${obj[options.messageKey]}`;
32-
}
32+
// do not put pkgVersion to pretty outputs
33+
obj[pkgVersionKey] = pkgJson.version;
3334
res = JSON.stringify(obj);
3435
}
3536

src/tests/index.test.ts

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import 'jest-extended';
22
import isString = require('lodash.isstring');
33
import { Writable } from 'stream';
4-
import loggerFactory from '..';
4+
import loggerFactory, { pkgVersionKey, loggerNameKey } from '..';
55
import { levels } from '../levels';
66

77
test('can create default logger', () => {
@@ -15,7 +15,7 @@ test('can create named logger', () => {
1515
expect((logger.options as any).loggerName).toBe('myApp');
1616
});
1717

18-
test.skip('can create logger with options', () => { // TODO: will work after pretty mechanics update - broken bc of deps update
18+
test('can create logger with options', () => {
1919
const logger = loggerFactory({ pretty: true });
2020
expect(logger).toBeDefined();
2121
expect(logger.options.pretty).toBe(true);
@@ -92,7 +92,7 @@ test('automatic severity field can be disabled by options', () =>
9292
test('logger version is logged', () =>
9393
new Promise((resolve, reject) => {
9494
const logger = loggerFactory({
95-
streams: [testWriteStream(resolve, json => expect(json.pkgVersion).not.toBe(undefined))],
95+
streams: [testWriteStream(resolve, json => expect(json[pkgVersionKey]).not.toBe(undefined))],
9696
});
9797

9898
logger.fatal('Hello');
@@ -120,8 +120,8 @@ test('silent stream does not write', () => {
120120

121121
const exampleMessages = [
122122
{ type: 'simple', logData: 'Hello' },
123-
{ type: 'message-key', logData: { message: 'You gotta do, what you gotta do' } },
124-
{ type: 'msg-key', logData: { message: 'Mirror, mirror, on the wall' } },
123+
{ type: 'message-key', logData: { message: 'You gotta do, what you gotta do', name: 'Futurama' } },
124+
{ type: 'msg-key', logData: { msg: 'Mirror, mirror, on the wall', name: 'Sleeping Beauty' } },
125125
];
126126

127127
exampleMessages.forEach(data => {
@@ -133,6 +133,10 @@ exampleMessages.forEach(data => {
133133
streams: [
134134
testWriteStream(resolve, json => {
135135
expect(json.message).toStartWith(`[${loggerName}] `);
136+
expect(json[loggerNameKey]).toBe(loggerName);
137+
if ((data.logData as any).name) {
138+
expect(json.name).toBe((data.logData as any).name);
139+
}
136140
}),
137141
],
138142
});
@@ -157,6 +161,9 @@ exampleMessages.forEach(data => {
157161
resolve,
158162
message => {
159163
expect(message).toContain(loggerName);
164+
if ((data.logData as any).name) {
165+
expect(message).toContain((data.logData as any).name);
166+
}
160167
},
161168
false
162169
),

0 commit comments

Comments
 (0)