From 20b328d3e3432576b5877b1db82edfe3846bb5a9 Mon Sep 17 00:00:00 2001 From: Harry Chen Date: Sun, 3 Jan 2021 23:34:07 +0800 Subject: [PATCH] feat: add update label and update meta for logger --- packages/logger/src/format.ts | 19 +++++++++++----- packages/logger/src/interface.ts | 4 ++++ packages/logger/src/logger.ts | 36 ++++++++++++++++++++++-------- packages/logger/test/index.test.ts | 12 ++++++++++ 4 files changed, 56 insertions(+), 15 deletions(-) diff --git a/packages/logger/src/format.ts b/packages/logger/src/format.ts index 130bfccecfc4..0171600801a1 100644 --- a/packages/logger/src/format.ts +++ b/packages/logger/src/format.ts @@ -1,19 +1,25 @@ import { format } from 'winston'; import { inspect, types } from 'util'; +import { IMidwayLogger } from './interface'; const { LEVEL, MESSAGE, SPLAT } = require('triple-beam'); export const displayCommonMessage = format((info, opts: { - uppercaseLevel?: boolean; - defaultMeta?: {[key: string]: any}; + defaultLabel?: string; + defaultMeta?: object; + target?: IMidwayLogger; }) => { if (!info.pid) { info.pid = process.pid; } - if (!info.LEVEL && opts.uppercaseLevel) { + if (!info.LEVEL) { info.LEVEL = info.level.toUpperCase(); } + if (!info.defaultLabel) { + info.defaultLabel = opts.defaultLabel || opts.target?.getDefaultLabel() || ''; + } + if (info instanceof Error) { // 参数只是 error 的情况 return Object.assign({ @@ -25,7 +31,8 @@ export const displayCommonMessage = format((info, opts: { stack: info.stack, pid: info.pid, LEVEL: info.LEVEL, - }, opts.defaultMeta); + defaultLabel: info.defaultLabel, + }, (opts.defaultMeta || opts.target?.getDefaultMeta() || {})); } // 处理数组,Map,Set 的 message @@ -49,7 +56,7 @@ export const displayCommonMessage = format((info, opts: { } } - return Object.assign(info, opts.defaultMeta); + return Object.assign(info, (opts.defaultMeta || opts.target?.getDefaultMeta() || {})); }); function joinLoggerLabel(labelSplit, ...labels) { @@ -71,7 +78,7 @@ export const displayLabels = format((info, opts) => { opts.labelSplit = opts.labelSplit || ':'; info.labelText = joinLoggerLabel( opts.labelSplit, - ...opts.defaultLabels, + info.defaultLabel, ...[].concat(info.label) ); return info; diff --git a/packages/logger/src/interface.ts b/packages/logger/src/interface.ts index eab5a230bdb5..49faed118461 100644 --- a/packages/logger/src/interface.ts +++ b/packages/logger/src/interface.ts @@ -15,6 +15,10 @@ export interface IMidwayLogger extends ILogger { disableError(); enableError(); updateLevel(level: LoggerLevel); + updateDefaultLabel(defaultLabel: string); + updateDefaultMeta(defaultMeta: object); + getDefaultLabel(): string; + getDefaultMeta(): object; } export type LoggerLevel = 'silly' | 'debug' | 'verbose' | 'info' | 'warn' | 'error'; diff --git a/packages/logger/src/logger.ts b/packages/logger/src/logger.ts index 213b3b551bfe..c0f8589fd647 100644 --- a/packages/logger/src/logger.ts +++ b/packages/logger/src/logger.ts @@ -1,6 +1,6 @@ import { createLogger, transports, Logger, format } from 'winston'; import * as DailyRotateFileTransport from 'winston-daily-rotate-file'; -import { DelegateLoggerOptions, LoggerLevel, LoggerOptions } from './interface'; +import { DelegateLoggerOptions, LoggerLevel, LoggerOptions, IMidwayLogger } from './interface'; import { DelegateTransport, EmptyTransport } from './transport'; import { displayLabels, displayCommonMessage } from './format'; import * as os from 'os'; @@ -12,12 +12,13 @@ export const EmptyLogger: Logger = createLogger().constructor as Logger; /** * base logger with console transport and file transport */ -export class MidwayBaseLogger extends EmptyLogger { +export class MidwayBaseLogger extends EmptyLogger implements IMidwayLogger { consoleTransport; fileTransport; errTransport; loggerOptions: LoggerOptions; - labels = []; + defaultLabel: string = ''; + defaultMetadata: object = {}; constructor(options: LoggerOptions = {}) { super(options); @@ -28,7 +29,11 @@ export class MidwayBaseLogger extends EmptyLogger { } this.loggerOptions = options; if (this.loggerOptions.defaultLabel) { - this.labels.push(this.loggerOptions.defaultLabel); + this.defaultLabel = this.loggerOptions.defaultLabel; + } + + if (this.loggerOptions.defaultMeta) { + this.defaultMetadata = this.loggerOptions.defaultMeta; } if(this.loggerOptions.format) { @@ -120,16 +125,21 @@ export class MidwayBaseLogger extends EmptyLogger { this.fileTransport.level = level; } + updateDefaultLabel(defaultLabel: string) { + this.defaultLabel = defaultLabel; + } + + updateDefaultMeta(defaultMetadata: object) { + this.defaultMetadata = defaultMetadata; + } + getDefaultLoggerConfigure() { return { format: format.combine( displayCommonMessage({ - uppercaseLevel: true, - defaultMeta: this.loggerOptions.defaultMeta, - }), - displayLabels({ - defaultLabels: this.labels, + target: this, }), + displayLabels(), format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss,SSS', }), @@ -143,6 +153,14 @@ export class MidwayBaseLogger extends EmptyLogger { ), }; } + + getDefaultLabel(): string { + return this.defaultLabel; + } + + getDefaultMeta(): object { + return this.defaultMetadata; + } } /** diff --git a/packages/logger/test/index.test.ts b/packages/logger/test/index.test.ts index 128effb70604..81496cb5bddd 100644 --- a/packages/logger/test/index.test.ts +++ b/packages/logger/test/index.test.ts @@ -260,9 +260,18 @@ describe('/test/index.test.ts', () => { logger.error('first message', new Error('my error'), { group: 'bbb' }); + + logger.updateDefaultMeta({ + name: 'my-another-site', + group: 'my-another-group' + }); + + logger.error('second message', new Error('my error')); + await sleep(); expect(fileExists(join(logsDir, 'test-logger.log'))).toBeTruthy(); expect(includeContent(join(logsDir, 'test-logger.log'), 'bbb.my-site error first message my error')).toBeTruthy(); + expect(includeContent(join(logsDir, 'test-logger.log'), 'my-another-group.my-another-site error second message Error: my error')).toBeTruthy(); const customFormatLogger = createLogger('testLogger1', { dir: logsDir, @@ -330,10 +339,13 @@ describe('/test/index.test.ts', () => { }); logger.error('test console error'); + logger.updateDefaultLabel('sandbox'); + logger.info('test change label'); await sleep(); expect(fileExists(join(logsDir, 'test-logger.log'))).toBeTruthy(); expect(includeContent(join(logsDir, 'test-logger.log'), '[main label] test console error')).toBeTruthy(); + expect(includeContent(join(logsDir, 'test-logger.log'), '[sandbox] test change label')).toBeTruthy(); await removeFileOrDir(logsDir); });