From e4c3c82ecc056d4e9ee53ff017ab506ed33c7286 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Tue, 10 Jan 2023 21:14:04 +0100 Subject: [PATCH] backend-common: reimplement createRootLogger using WinstonLogger Signed-off-by: Patrik Oldsberg --- .../src/logging/createRootLogger.ts | 79 +++++++++++++++++++ .../src/logging/globalLoggers.ts | 2 +- packages/backend-common/src/logging/index.ts | 1 + 3 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 packages/backend-common/src/logging/createRootLogger.ts diff --git a/packages/backend-common/src/logging/createRootLogger.ts b/packages/backend-common/src/logging/createRootLogger.ts new file mode 100644 index 0000000000..630a3015e1 --- /dev/null +++ b/packages/backend-common/src/logging/createRootLogger.ts @@ -0,0 +1,79 @@ +/* + * 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 { WinstonLogger } from '@backstage/backend-app-api'; +import { merge } from 'lodash'; +import * as winston from 'winston'; +import { LoggerOptions } from 'winston'; +import { setRootLogger } from './globalLoggers'; + +const redacter = WinstonLogger.redacter(); + +export const setRootLoggerRedactionList = redacter.add; + +/** + * A winston formatting function that finds occurrences of filteredKeys + * and replaces them with the corresponding identifier. + * + * @public + */ +export const redactWinstonLogLine: ( + info: winston.Logform.TransformableInfo, +) => winston.Logform.TransformableInfo | boolean = redacter.format.transform; + +/** + * Creates a default "root" logger. This also calls {@link setRootLogger} under + * the hood. + * + * @remarks + * + * This is the logger instance that will be the foundation for all other logger + * instances passed to plugins etc, in a given backend. + * + * @public + */ +export function createRootLogger( + options: winston.LoggerOptions = {}, + env = process.env, +): winston.Logger { + const logger = winston + .createLogger( + merge( + { + level: env.LOG_LEVEL || 'info', + format: winston.format.combine( + redacter.format, + env.NODE_ENV === 'production' + ? winston.format.json() + : WinstonLogger.colorFormat(), + ), + transports: [ + new winston.transports.Console({ + silent: env.JEST_WORKER_ID !== undefined && !env.LOG_LEVEL, + }), + ], + }, + options, + ), + ) + .child({ service: 'backstage' }); + + setRootLogger(logger); + + return logger; +} + +setRootLogger(createRootLogger()); diff --git a/packages/backend-common/src/logging/globalLoggers.ts b/packages/backend-common/src/logging/globalLoggers.ts index b9ec04b654..7567deb646 100644 --- a/packages/backend-common/src/logging/globalLoggers.ts +++ b/packages/backend-common/src/logging/globalLoggers.ts @@ -27,7 +27,7 @@ export function getVoidLogger(): winston.Logger { }); } -let rootLogger: winston.Logger = createRootLogger(); +let rootLogger: winston.Logger; /** * Gets the current root logger. diff --git a/packages/backend-common/src/logging/index.ts b/packages/backend-common/src/logging/index.ts index ed49b25b55..9a32885371 100644 --- a/packages/backend-common/src/logging/index.ts +++ b/packages/backend-common/src/logging/index.ts @@ -15,4 +15,5 @@ */ export { getRootLogger, getVoidLogger, setRootLogger } from './globalLoggers'; +export { createRootLogger } from './createRootLogger'; export { loggerToWinstonLogger } from './loggerToWinstonLogger';