From 851e6639b4c6b272fd6532855b106cee8821c462 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Tue, 10 Jan 2023 17:39:05 +0100 Subject: [PATCH] backend-app-api: added WinstonLogger with color format Signed-off-by: Patrik Oldsberg --- .../src/logging/WinstonLogger.ts | 89 +++++++++++++++++++ .../backend-app-api/src/logging/formats.ts | 45 ---------- packages/backend-app-api/src/logging/index.ts | 17 ++++ 3 files changed, 106 insertions(+), 45 deletions(-) create mode 100644 packages/backend-app-api/src/logging/WinstonLogger.ts delete mode 100644 packages/backend-app-api/src/logging/formats.ts create mode 100644 packages/backend-app-api/src/logging/index.ts diff --git a/packages/backend-app-api/src/logging/WinstonLogger.ts b/packages/backend-app-api/src/logging/WinstonLogger.ts new file mode 100644 index 0000000000..99c120f3ed --- /dev/null +++ b/packages/backend-app-api/src/logging/WinstonLogger.ts @@ -0,0 +1,89 @@ +/* + * 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 { + LoggerService, + LogMeta, + RootLoggerService, +} from '@backstage/backend-plugin-api'; +import { Format, TransformableInfo } from 'logform'; +import { Logger, format } from 'winston'; + +/** + * @public + */ +export class WinstonLogger implements RootLoggerService { + #winston: Logger; + + static fromWinston(logger: Logger): WinstonLogger { + return new WinstonLogger(logger); + } + + static colorFormat(): Format { + const colorizer = format.colorize(); + + return format.combine( + format.timestamp(), + format.colorize({ + colors: { + timestamp: 'dim', + prefix: 'blue', + field: 'cyan', + debug: 'grey', + }, + }), + format.printf((info: TransformableInfo) => { + const { timestamp, level, message, plugin, service, ...fields } = info; + const prefix = plugin || service; + const timestampColor = colorizer.colorize('timestamp', timestamp); + const prefixColor = colorizer.colorize('prefix', prefix); + + const extraFields = Object.entries(fields) + .map( + ([key, value]) => + `${colorizer.colorize('field', `${key}`)}=${value}`, + ) + .join(' '); + + return `${timestampColor} ${prefixColor} ${level} ${message} ${extraFields}`; + }), + ); + } + + constructor(winston: Logger) { + this.#winston = winston; + } + + error(message: string, meta?: LogMeta): void { + this.#winston.error(message, meta); + } + + warn(message: string, meta?: LogMeta): void { + this.#winston.warn(message, meta); + } + + info(message: string, meta?: LogMeta): void { + this.#winston.info(message, meta); + } + + debug(message: string, meta?: LogMeta): void { + this.#winston.debug(message, meta); + } + + child(meta: LogMeta): LoggerService { + return new WinstonLogger(this.#winston.child(meta)); + } +} diff --git a/packages/backend-app-api/src/logging/formats.ts b/packages/backend-app-api/src/logging/formats.ts deleted file mode 100644 index 53eb55e790..0000000000 --- a/packages/backend-app-api/src/logging/formats.ts +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright 2020 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 * as winston from 'winston'; -import { TransformableInfo } from 'logform'; - -const coloredTemplate = (info: TransformableInfo) => { - const { timestamp, level, message, plugin, service, ...fields } = info; - const colorizer = winston.format.colorize(); - const prefix = plugin || service; - const timestampColor = colorizer.colorize('timestamp', timestamp); - const prefixColor = colorizer.colorize('prefix', prefix); - - const extraFields = Object.entries(fields) - .map(([key, value]) => `${colorizer.colorize('field', `${key}`)}=${value}`) - .join(' '); - - return `${timestampColor} ${prefixColor} ${level} ${message} ${extraFields}`; -}; - -/** - * A logging format that adds coloring to console output. - * - * @public - */ -export const coloredFormat = winston.format.combine( - winston.format.timestamp(), - winston.format.colorize({ - colors: { timestamp: 'dim', prefix: 'blue', field: 'cyan', debug: 'grey' }, - }), - winston.format.printf(coloredTemplate), -); diff --git a/packages/backend-app-api/src/logging/index.ts b/packages/backend-app-api/src/logging/index.ts new file mode 100644 index 0000000000..3e7d43ff50 --- /dev/null +++ b/packages/backend-app-api/src/logging/index.ts @@ -0,0 +1,17 @@ +/* + * 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. + */ + +export { WinstonLogger } from './WinstonLogger';