From 71a5ec0f06a849a4ba120dc4f9b771960118ab24 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Mon, 6 Feb 2023 16:36:29 +0100 Subject: [PATCH 1/3] backend-plugin-api: inlined LogMeta type Signed-off-by: Patrik Oldsberg --- .changeset/selfish-frogs-punch.md | 5 ++++ .changeset/wild-donkeys-rescue.md | 6 ++++ packages/backend-app-api/api-report.md | 13 ++++----- .../src/logging/WinstonLogger.ts | 13 ++++----- packages/backend-plugin-api/api-report.md | 15 ++++------ .../src/services/definitions/LoggerService.ts | 15 ++++------ .../src/services/definitions/index.ts | 2 +- .../next/services/MockRootLoggerService.ts | 29 +++++++++++++------ 8 files changed, 54 insertions(+), 44 deletions(-) create mode 100644 .changeset/selfish-frogs-punch.md create mode 100644 .changeset/wild-donkeys-rescue.md diff --git a/.changeset/selfish-frogs-punch.md b/.changeset/selfish-frogs-punch.md new file mode 100644 index 0000000000..9dedd3544d --- /dev/null +++ b/.changeset/selfish-frogs-punch.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-plugin-api': minor +--- + +**BREAKING**: Inlined `LogMeta` type. diff --git a/.changeset/wild-donkeys-rescue.md b/.changeset/wild-donkeys-rescue.md new file mode 100644 index 0000000000..43dc3743bb --- /dev/null +++ b/.changeset/wild-donkeys-rescue.md @@ -0,0 +1,6 @@ +--- +'@backstage/backend-test-utils': patch +'@backstage/backend-app-api': patch +--- + +Updated usages of `LogMeta`. diff --git a/packages/backend-app-api/api-report.md b/packages/backend-app-api/api-report.md index 7ad4b590ab..67da4cb018 100644 --- a/packages/backend-app-api/api-report.md +++ b/packages/backend-app-api/api-report.md @@ -21,7 +21,6 @@ import { IdentityService } from '@backstage/backend-plugin-api'; import { LifecycleService } from '@backstage/backend-plugin-api'; import { LoadConfigOptionsRemote } from '@backstage/config-loader'; import { LoggerService } from '@backstage/backend-plugin-api'; -import { LogMeta } from '@backstage/backend-plugin-api'; import { PermissionsService } from '@backstage/backend-plugin-api'; import { PluginCacheManager } from '@backstage/backend-common'; import { PluginDatabaseManager } from '@backstage/backend-common'; @@ -263,21 +262,21 @@ export class WinstonLogger implements RootLoggerService { // (undocumented) addRedactions(redactions: Iterable): void; // (undocumented) - child(meta: LogMeta): LoggerService; + child(meta: Record): LoggerService; static colorFormat(): Format; static create(options: WinstonLoggerOptions): WinstonLogger; // (undocumented) - debug(message: string, meta?: LogMeta): void; + debug(message: string, meta?: Record): void; // (undocumented) - error(message: string, meta?: LogMeta): void; + error(message: string, meta?: Record): void; // (undocumented) - info(message: string, meta?: LogMeta): void; + info(message: string, meta?: Record): void; static redacter(): { format: Format; add: (redactions: Iterable) => void; }; // (undocumented) - warn(message: string, meta?: LogMeta): void; + warn(message: string, meta?: Record): void; } // @public (undocumented) @@ -287,7 +286,7 @@ export interface WinstonLoggerOptions { // (undocumented) level: string; // (undocumented) - meta?: LogMeta; + meta?: Record; // (undocumented) transports: transport[]; } diff --git a/packages/backend-app-api/src/logging/WinstonLogger.ts b/packages/backend-app-api/src/logging/WinstonLogger.ts index d32b816523..8d48015580 100644 --- a/packages/backend-app-api/src/logging/WinstonLogger.ts +++ b/packages/backend-app-api/src/logging/WinstonLogger.ts @@ -16,7 +16,6 @@ import { LoggerService, - LogMeta, RootLoggerService, } from '@backstage/backend-plugin-api'; import { Format, TransformableInfo } from 'logform'; @@ -33,7 +32,7 @@ import { escapeRegExp } from '../lib/escapeRegExp'; * @public */ export interface WinstonLoggerOptions { - meta?: LogMeta; + meta?: Record; level: string; format: Format; transports: Transport[]; @@ -150,23 +149,23 @@ export class WinstonLogger implements RootLoggerService { this.#addRedactions = addRedactions; } - error(message: string, meta?: LogMeta): void { + error(message: string, meta?: Record): void { this.#winston.error(message, meta); } - warn(message: string, meta?: LogMeta): void { + warn(message: string, meta?: Record): void { this.#winston.warn(message, meta); } - info(message: string, meta?: LogMeta): void { + info(message: string, meta?: Record): void { this.#winston.info(message, meta); } - debug(message: string, meta?: LogMeta): void { + debug(message: string, meta?: Record): void { this.#winston.debug(message, meta); } - child(meta: LogMeta): LoggerService { + child(meta: Record): LoggerService { return new WinstonLogger(this.#winston.child(meta)); } diff --git a/packages/backend-plugin-api/api-report.md b/packages/backend-plugin-api/api-report.md index 8293ac193f..e0b8fdfa04 100644 --- a/packages/backend-plugin-api/api-report.md +++ b/packages/backend-plugin-api/api-report.md @@ -311,22 +311,17 @@ export interface LifecycleServiceShutdownOptions { // @public export interface LoggerService { // (undocumented) - child(meta: LogMeta): LoggerService; + child(meta: Record): LoggerService; // (undocumented) - debug(message: string, meta?: Error | LogMeta): void; + debug(message: string, meta?: Error | Record): void; // (undocumented) - error(message: string, meta?: Error | LogMeta): void; + error(message: string, meta?: Error | Record): void; // (undocumented) - info(message: string, meta?: Error | LogMeta): void; + info(message: string, meta?: Error | Record): void; // (undocumented) - warn(message: string, meta?: Error | LogMeta): void; + warn(message: string, meta?: Error | Record): void; } -// @public (undocumented) -export type LogMeta = { - [name: string]: unknown; -}; - // @public (undocumented) export interface PermissionsService extends PermissionEvaluator {} diff --git a/packages/backend-plugin-api/src/services/definitions/LoggerService.ts b/packages/backend-plugin-api/src/services/definitions/LoggerService.ts index 269dfa0166..ce59b47007 100644 --- a/packages/backend-plugin-api/src/services/definitions/LoggerService.ts +++ b/packages/backend-plugin-api/src/services/definitions/LoggerService.ts @@ -14,21 +14,16 @@ * limitations under the License. */ -/** - * @public - */ -export type LogMeta = { [name: string]: unknown }; - /** * A service that provides a logging facility. * * @public */ export interface LoggerService { - error(message: string, meta?: Error | LogMeta): void; - warn(message: string, meta?: Error | LogMeta): void; - info(message: string, meta?: Error | LogMeta): void; - debug(message: string, meta?: Error | LogMeta): void; + error(message: string, meta?: Error | Record): void; + warn(message: string, meta?: Error | Record): void; + info(message: string, meta?: Error | Record): void; + debug(message: string, meta?: Error | Record): void; - child(meta: LogMeta): LoggerService; + child(meta: Record): LoggerService; } diff --git a/packages/backend-plugin-api/src/services/definitions/index.ts b/packages/backend-plugin-api/src/services/definitions/index.ts index 720b4d634d..35c2f0251c 100644 --- a/packages/backend-plugin-api/src/services/definitions/index.ts +++ b/packages/backend-plugin-api/src/services/definitions/index.ts @@ -30,7 +30,7 @@ export type { LifecycleServiceShutdownHook, LifecycleServiceShutdownOptions, } from './LifecycleService'; -export type { LoggerService, LogMeta } from './LoggerService'; +export type { LoggerService } from './LoggerService'; export type { PermissionsService } from './PermissionsService'; export type { PluginMetadataService } from './PluginMetadataService'; export type { RootHttpRouterService } from './RootHttpRouterService'; diff --git a/packages/backend-test-utils/src/next/services/MockRootLoggerService.ts b/packages/backend-test-utils/src/next/services/MockRootLoggerService.ts index 780d330bfb..5965792932 100644 --- a/packages/backend-test-utils/src/next/services/MockRootLoggerService.ts +++ b/packages/backend-test-utils/src/next/services/MockRootLoggerService.ts @@ -16,38 +16,49 @@ import { LoggerService, - LogMeta, RootLoggerService, } from '@backstage/backend-plugin-api'; import type { mockServices } from './mockServices'; export class MockRootLoggerService implements RootLoggerService { #levels: Exclude; - #meta: LogMeta; + #meta: Record; - error(message: string, meta?: LogMeta | Error | undefined): void { + error( + message: string, + meta?: Record | Error | undefined, + ): void { this.#log('error', message, meta); } - warn(message: string, meta?: LogMeta | Error | undefined): void { + warn( + message: string, + meta?: Record | Error | undefined, + ): void { this.#log('warn', message, meta); } - info(message: string, meta?: LogMeta | Error | undefined): void { + info( + message: string, + meta?: Record | Error | undefined, + ): void { this.#log('info', message, meta); } - debug(message: string, meta?: LogMeta | Error | undefined): void { + debug( + message: string, + meta?: Record | Error | undefined, + ): void { this.#log('debug', message, meta); } - child(meta: LogMeta): LoggerService { + child(meta: Record): LoggerService { return new MockRootLoggerService(this.#levels, { ...this.#meta, ...meta }); } constructor( levels: mockServices.rootLogger.Options['levels'], - meta: LogMeta, + meta: Record, ) { if (typeof levels === 'boolean') { this.#levels = { @@ -65,7 +76,7 @@ export class MockRootLoggerService implements RootLoggerService { #log( level: 'error' | 'warn' | 'info' | 'debug', message: string, - meta?: LogMeta | Error | undefined, + meta?: Record | Error | undefined, ) { if (this.#levels[level]) { const labels = Object.entries(this.#meta) From 7e7557a2be313064e79f5d3ab7fc68b26a3a57b8 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Mon, 6 Feb 2023 16:58:42 +0100 Subject: [PATCH 2/3] backend-test-utils: switch levels to level for mock logger Signed-off-by: Patrik Oldsberg --- .changeset/hip-tables-prove.md | 5 + packages/backend-test-utils/api-report.md | 9 +- .../services/MockRootLoggerService.test.ts | 131 ++++++++++++++++++ .../next/services/MockRootLoggerService.ts | 41 +++--- .../src/next/services/mockServices.ts | 6 +- 5 files changed, 163 insertions(+), 29 deletions(-) create mode 100644 .changeset/hip-tables-prove.md create mode 100644 packages/backend-test-utils/src/next/services/MockRootLoggerService.test.ts diff --git a/.changeset/hip-tables-prove.md b/.changeset/hip-tables-prove.md new file mode 100644 index 0000000000..bc2c4e83d6 --- /dev/null +++ b/.changeset/hip-tables-prove.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-test-utils': patch +--- + +Updated the `mockServices.rootLogger` options to accept a single level option instead. diff --git a/packages/backend-test-utils/api-report.md b/packages/backend-test-utils/api-report.md index 672c574cb2..d99cf51866 100644 --- a/packages/backend-test-utils/api-report.md +++ b/packages/backend-test-utils/api-report.md @@ -91,14 +91,7 @@ export namespace mockServices { export namespace rootLogger { // (undocumented) export type Options = { - levels: - | boolean - | { - error: boolean; - warn: boolean; - info: boolean; - debug: boolean; - }; + level?: 'none' | 'error' | 'warn' | 'info' | 'debug'; }; const // (undocumented) factory: (options?: Options | undefined) => ServiceFactory; diff --git a/packages/backend-test-utils/src/next/services/MockRootLoggerService.test.ts b/packages/backend-test-utils/src/next/services/MockRootLoggerService.test.ts new file mode 100644 index 0000000000..a3cbb5c384 --- /dev/null +++ b/packages/backend-test-utils/src/next/services/MockRootLoggerService.test.ts @@ -0,0 +1,131 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { MockRootLoggerService } from './MockRootLoggerService'; + +describe('MockRootLoggerService', () => { + afterEach(() => { + jest.resetAllMocks(); + }); + + it('should be silent by default', () => { + jest.spyOn(console, 'error').mockImplementation(() => {}); + jest.spyOn(console, 'warn').mockImplementation(() => {}); + jest.spyOn(console, 'info').mockImplementation(() => {}); + jest.spyOn(console, 'debug').mockImplementation(() => {}); + + const logger = MockRootLoggerService.create(); + logger.error('error'); + logger.warn('warn'); + logger.info('info'); + logger.debug('debug'); + + expect(console.error).not.toHaveBeenCalled(); + expect(console.warn).not.toHaveBeenCalled(); + expect(console.info).not.toHaveBeenCalled(); + expect(console.debug).not.toHaveBeenCalled(); + }); + + it('shuld be able to set none level', () => { + jest.spyOn(console, 'error').mockImplementation(() => {}); + jest.spyOn(console, 'warn').mockImplementation(() => {}); + jest.spyOn(console, 'info').mockImplementation(() => {}); + jest.spyOn(console, 'debug').mockImplementation(() => {}); + + const logger = MockRootLoggerService.create({ level: 'none' }); + logger.error('error'); + logger.warn('warn'); + logger.info('info'); + logger.debug('debug'); + + expect(console.error).not.toHaveBeenCalled(); + expect(console.warn).not.toHaveBeenCalled(); + expect(console.info).not.toHaveBeenCalled(); + expect(console.debug).not.toHaveBeenCalled(); + }); + + it('shuld be able to set error level', () => { + jest.spyOn(console, 'error').mockImplementation(() => {}); + jest.spyOn(console, 'warn').mockImplementation(() => {}); + jest.spyOn(console, 'info').mockImplementation(() => {}); + jest.spyOn(console, 'debug').mockImplementation(() => {}); + + const logger = MockRootLoggerService.create({ level: 'error' }); + logger.error('error'); + logger.warn('warn'); + logger.info('info'); + logger.debug('debug'); + + expect(console.error).toHaveBeenCalled(); + expect(console.warn).not.toHaveBeenCalled(); + expect(console.info).not.toHaveBeenCalled(); + expect(console.debug).not.toHaveBeenCalled(); + }); + + it('shuld be able to set warn level', () => { + jest.spyOn(console, 'error').mockImplementation(() => {}); + jest.spyOn(console, 'warn').mockImplementation(() => {}); + jest.spyOn(console, 'info').mockImplementation(() => {}); + jest.spyOn(console, 'debug').mockImplementation(() => {}); + + const logger = MockRootLoggerService.create({ level: 'warn' }); + logger.error('error'); + logger.warn('warn'); + logger.info('info'); + logger.debug('debug'); + + expect(console.error).toHaveBeenCalled(); + expect(console.warn).toHaveBeenCalled(); + expect(console.info).not.toHaveBeenCalled(); + expect(console.debug).not.toHaveBeenCalled(); + }); + + it('shuld be able to set info level', () => { + jest.spyOn(console, 'error').mockImplementation(() => {}); + jest.spyOn(console, 'warn').mockImplementation(() => {}); + jest.spyOn(console, 'info').mockImplementation(() => {}); + jest.spyOn(console, 'debug').mockImplementation(() => {}); + + const logger = MockRootLoggerService.create({ level: 'info' }); + logger.error('error'); + logger.warn('warn'); + logger.info('info'); + logger.debug('debug'); + + expect(console.error).toHaveBeenCalled(); + expect(console.warn).toHaveBeenCalled(); + expect(console.info).toHaveBeenCalled(); + expect(console.debug).not.toHaveBeenCalled(); + }); + + it('shuld be able to set debug level', () => { + jest.spyOn(console, 'error').mockImplementation(() => {}); + jest.spyOn(console, 'warn').mockImplementation(() => {}); + jest.spyOn(console, 'info').mockImplementation(() => {}); + jest.spyOn(console, 'debug').mockImplementation(() => {}); + + const logger = MockRootLoggerService.create({ level: 'debug' }); + logger.error('error'); + logger.warn('warn'); + logger.info('info'); + logger.debug('debug'); + + expect(console.error).toHaveBeenCalled(); + expect(console.warn).toHaveBeenCalled(); + expect(console.info).toHaveBeenCalled(); + expect(console.debug).toHaveBeenCalled(); + }); +}); diff --git a/packages/backend-test-utils/src/next/services/MockRootLoggerService.ts b/packages/backend-test-utils/src/next/services/MockRootLoggerService.ts index 5965792932..fabba82a0f 100644 --- a/packages/backend-test-utils/src/next/services/MockRootLoggerService.ts +++ b/packages/backend-test-utils/src/next/services/MockRootLoggerService.ts @@ -20,10 +20,28 @@ import { } from '@backstage/backend-plugin-api'; import type { mockServices } from './mockServices'; +const levels = { + none: 0, + error: 1, + warn: 2, + info: 3, + debug: 4, +}; + export class MockRootLoggerService implements RootLoggerService { - #levels: Exclude; + #level: number; #meta: Record; + static create( + options?: mockServices.rootLogger.Options, + ): MockRootLoggerService { + const level = options?.level ?? 'none'; + if (!(level in levels)) { + throw new Error(`Invalid log level '${level}'`); + } + return new MockRootLoggerService(levels[level], {}); + } + error( message: string, meta?: Record | Error | undefined, @@ -53,23 +71,11 @@ export class MockRootLoggerService implements RootLoggerService { } child(meta: Record): LoggerService { - return new MockRootLoggerService(this.#levels, { ...this.#meta, ...meta }); + return new MockRootLoggerService(this.#level, { ...this.#meta, ...meta }); } - constructor( - levels: mockServices.rootLogger.Options['levels'], - meta: Record, - ) { - if (typeof levels === 'boolean') { - this.#levels = { - error: levels, - debug: levels, - info: levels, - warn: levels, - }; - } else { - this.#levels = levels; - } + private constructor(level: number, meta: Record) { + this.#level = level; this.#meta = meta; } @@ -78,7 +84,8 @@ export class MockRootLoggerService implements RootLoggerService { message: string, meta?: Record | Error | undefined, ) { - if (this.#levels[level]) { + const levelValue = levels[level] ?? 0; + if (levelValue <= this.#level) { const labels = Object.entries(this.#meta) .map(([key, value]) => `${key}=${value}`) .join(','); diff --git a/packages/backend-test-utils/src/next/services/mockServices.ts b/packages/backend-test-utils/src/next/services/mockServices.ts index 5f771f13c5..2a56bd78b8 100644 --- a/packages/backend-test-utils/src/next/services/mockServices.ts +++ b/packages/backend-test-utils/src/next/services/mockServices.ts @@ -67,13 +67,11 @@ export namespace mockServices { } export function rootLogger(options?: rootLogger.Options): LoggerService { - return new MockRootLoggerService(options?.levels ?? false, {}); + return MockRootLoggerService.create(options); } export namespace rootLogger { export type Options = { - levels: - | boolean - | { error: boolean; warn: boolean; info: boolean; debug: boolean }; + level?: 'none' | 'error' | 'warn' | 'info' | 'debug'; }; export const factory = simpleFactory(coreServices.rootLogger, rootLogger); From c769924e856cdf815b3193222611f2e578caa39e Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Tue, 7 Feb 2023 11:43:08 +0100 Subject: [PATCH 3/3] backend-plugin-api: update old LogMeta to use JsonObject instead Signed-off-by: Patrik Oldsberg --- .changeset/selfish-frogs-punch.md | 2 +- packages/backend-app-api/api-report.md | 13 +++++---- .../src/logging/WinstonLogger.ts | 13 +++++---- .../src/logging/loggerToWinstonLogger.ts | 3 +- packages/backend-plugin-api/api-report.md | 11 +++---- .../src/services/definitions/LoggerService.ts | 12 ++++---- .../next/services/MockRootLoggerService.ts | 29 ++++++------------- 7 files changed, 39 insertions(+), 44 deletions(-) diff --git a/.changeset/selfish-frogs-punch.md b/.changeset/selfish-frogs-punch.md index 9dedd3544d..6484576af8 100644 --- a/.changeset/selfish-frogs-punch.md +++ b/.changeset/selfish-frogs-punch.md @@ -2,4 +2,4 @@ '@backstage/backend-plugin-api': minor --- -**BREAKING**: Inlined `LogMeta` type. +**BREAKING**: Switched out `LogMeta` type for `JsonObject`. diff --git a/packages/backend-app-api/api-report.md b/packages/backend-app-api/api-report.md index 67da4cb018..b7670747e4 100644 --- a/packages/backend-app-api/api-report.md +++ b/packages/backend-app-api/api-report.md @@ -18,6 +18,7 @@ import { HelmetOptions } from 'helmet'; import * as http from 'http'; import { HttpRouterService } from '@backstage/backend-plugin-api'; import { IdentityService } from '@backstage/backend-plugin-api'; +import { JsonObject } from '@backstage/types'; import { LifecycleService } from '@backstage/backend-plugin-api'; import { LoadConfigOptionsRemote } from '@backstage/config-loader'; import { LoggerService } from '@backstage/backend-plugin-api'; @@ -262,21 +263,21 @@ export class WinstonLogger implements RootLoggerService { // (undocumented) addRedactions(redactions: Iterable): void; // (undocumented) - child(meta: Record): LoggerService; + child(meta: JsonObject): LoggerService; static colorFormat(): Format; static create(options: WinstonLoggerOptions): WinstonLogger; // (undocumented) - debug(message: string, meta?: Record): void; + debug(message: string, meta?: JsonObject): void; // (undocumented) - error(message: string, meta?: Record): void; + error(message: string, meta?: JsonObject): void; // (undocumented) - info(message: string, meta?: Record): void; + info(message: string, meta?: JsonObject): void; static redacter(): { format: Format; add: (redactions: Iterable) => void; }; // (undocumented) - warn(message: string, meta?: Record): void; + warn(message: string, meta?: JsonObject): void; } // @public (undocumented) @@ -286,7 +287,7 @@ export interface WinstonLoggerOptions { // (undocumented) level: string; // (undocumented) - meta?: Record; + meta?: JsonObject; // (undocumented) transports: transport[]; } diff --git a/packages/backend-app-api/src/logging/WinstonLogger.ts b/packages/backend-app-api/src/logging/WinstonLogger.ts index 8d48015580..06a189508b 100644 --- a/packages/backend-app-api/src/logging/WinstonLogger.ts +++ b/packages/backend-app-api/src/logging/WinstonLogger.ts @@ -18,6 +18,7 @@ import { LoggerService, RootLoggerService, } from '@backstage/backend-plugin-api'; +import { JsonObject } from '@backstage/types'; import { Format, TransformableInfo } from 'logform'; import { Logger, @@ -32,7 +33,7 @@ import { escapeRegExp } from '../lib/escapeRegExp'; * @public */ export interface WinstonLoggerOptions { - meta?: Record; + meta?: JsonObject; level: string; format: Format; transports: Transport[]; @@ -149,23 +150,23 @@ export class WinstonLogger implements RootLoggerService { this.#addRedactions = addRedactions; } - error(message: string, meta?: Record): void { + error(message: string, meta?: JsonObject): void { this.#winston.error(message, meta); } - warn(message: string, meta?: Record): void { + warn(message: string, meta?: JsonObject): void { this.#winston.warn(message, meta); } - info(message: string, meta?: Record): void { + info(message: string, meta?: JsonObject): void { this.#winston.info(message, meta); } - debug(message: string, meta?: Record): void { + debug(message: string, meta?: JsonObject): void { this.#winston.debug(message, meta); } - child(meta: Record): LoggerService { + child(meta: JsonObject): LoggerService { return new WinstonLogger(this.#winston.child(meta)); } diff --git a/packages/backend-common/src/logging/loggerToWinstonLogger.ts b/packages/backend-common/src/logging/loggerToWinstonLogger.ts index f15bd5be81..4ba88358d2 100644 --- a/packages/backend-common/src/logging/loggerToWinstonLogger.ts +++ b/packages/backend-common/src/logging/loggerToWinstonLogger.ts @@ -15,6 +15,7 @@ */ import { LoggerService } from '@backstage/backend-plugin-api'; +import { JsonObject } from '@backstage/types'; import { Logger as WinstonLogger, createLogger } from 'winston'; import Transport, { TransportStreamOptions } from 'winston-transport'; @@ -31,7 +32,7 @@ class BackstageLoggerTransport extends Transport { callback(); return; } - const { level, message, ...meta } = info as { [name: string]: unknown }; + const { level, message, ...meta } = info as JsonObject; switch (level) { case 'error': this.backstageLogger.error(String(message), meta); diff --git a/packages/backend-plugin-api/api-report.md b/packages/backend-plugin-api/api-report.md index e0b8fdfa04..3ad972020d 100644 --- a/packages/backend-plugin-api/api-report.md +++ b/packages/backend-plugin-api/api-report.md @@ -8,6 +8,7 @@ import { Config } from '@backstage/config'; import { Handler } from 'express'; import { IdentityApi } from '@backstage/plugin-auth-node'; +import { JsonObject } from '@backstage/types'; import { JsonValue } from '@backstage/types'; import { Knex } from 'knex'; import { PermissionEvaluator } from '@backstage/plugin-permission-common'; @@ -311,15 +312,15 @@ export interface LifecycleServiceShutdownOptions { // @public export interface LoggerService { // (undocumented) - child(meta: Record): LoggerService; + child(meta: JsonObject): LoggerService; // (undocumented) - debug(message: string, meta?: Error | Record): void; + debug(message: string, meta?: Error | JsonObject): void; // (undocumented) - error(message: string, meta?: Error | Record): void; + error(message: string, meta?: Error | JsonObject): void; // (undocumented) - info(message: string, meta?: Error | Record): void; + info(message: string, meta?: Error | JsonObject): void; // (undocumented) - warn(message: string, meta?: Error | Record): void; + warn(message: string, meta?: Error | JsonObject): void; } // @public (undocumented) diff --git a/packages/backend-plugin-api/src/services/definitions/LoggerService.ts b/packages/backend-plugin-api/src/services/definitions/LoggerService.ts index ce59b47007..2e4edc60be 100644 --- a/packages/backend-plugin-api/src/services/definitions/LoggerService.ts +++ b/packages/backend-plugin-api/src/services/definitions/LoggerService.ts @@ -14,16 +14,18 @@ * limitations under the License. */ +import { JsonObject } from '@backstage/types'; + /** * A service that provides a logging facility. * * @public */ export interface LoggerService { - error(message: string, meta?: Error | Record): void; - warn(message: string, meta?: Error | Record): void; - info(message: string, meta?: Error | Record): void; - debug(message: string, meta?: Error | Record): void; + error(message: string, meta?: Error | JsonObject): void; + warn(message: string, meta?: Error | JsonObject): void; + info(message: string, meta?: Error | JsonObject): void; + debug(message: string, meta?: Error | JsonObject): void; - child(meta: Record): LoggerService; + child(meta: JsonObject): LoggerService; } diff --git a/packages/backend-test-utils/src/next/services/MockRootLoggerService.ts b/packages/backend-test-utils/src/next/services/MockRootLoggerService.ts index fabba82a0f..8b973eeeab 100644 --- a/packages/backend-test-utils/src/next/services/MockRootLoggerService.ts +++ b/packages/backend-test-utils/src/next/services/MockRootLoggerService.ts @@ -18,6 +18,7 @@ import { LoggerService, RootLoggerService, } from '@backstage/backend-plugin-api'; +import { JsonObject } from '@backstage/types'; import type { mockServices } from './mockServices'; const levels = { @@ -30,7 +31,7 @@ const levels = { export class MockRootLoggerService implements RootLoggerService { #level: number; - #meta: Record; + #meta: JsonObject; static create( options?: mockServices.rootLogger.Options, @@ -42,39 +43,27 @@ export class MockRootLoggerService implements RootLoggerService { return new MockRootLoggerService(levels[level], {}); } - error( - message: string, - meta?: Record | Error | undefined, - ): void { + error(message: string, meta?: JsonObject | Error | undefined): void { this.#log('error', message, meta); } - warn( - message: string, - meta?: Record | Error | undefined, - ): void { + warn(message: string, meta?: JsonObject | Error | undefined): void { this.#log('warn', message, meta); } - info( - message: string, - meta?: Record | Error | undefined, - ): void { + info(message: string, meta?: JsonObject | Error | undefined): void { this.#log('info', message, meta); } - debug( - message: string, - meta?: Record | Error | undefined, - ): void { + debug(message: string, meta?: JsonObject | Error | undefined): void { this.#log('debug', message, meta); } - child(meta: Record): LoggerService { + child(meta: JsonObject): LoggerService { return new MockRootLoggerService(this.#level, { ...this.#meta, ...meta }); } - private constructor(level: number, meta: Record) { + private constructor(level: number, meta: JsonObject) { this.#level = level; this.#meta = meta; } @@ -82,7 +71,7 @@ export class MockRootLoggerService implements RootLoggerService { #log( level: 'error' | 'warn' | 'info' | 'debug', message: string, - meta?: Record | Error | undefined, + meta?: JsonObject | Error | undefined, ) { const levelValue = levels[level] ?? 0; if (levelValue <= this.#level) {