diff --git a/plugins/techdocs-backend/src/service/DocsSynchronizer.test.ts b/plugins/techdocs-backend/src/service/DocsSynchronizer.test.ts index 05dfb5bdcc..cec79cda58 100644 --- a/plugins/techdocs-backend/src/service/DocsSynchronizer.test.ts +++ b/plugins/techdocs-backend/src/service/DocsSynchronizer.test.ts @@ -25,6 +25,8 @@ import { PreparerBuilder, PublisherBase, } from '@backstage/plugin-techdocs-node'; +import { PassThrough } from 'stream'; +import * as winston from 'winston'; import { TechDocsCache } from '../cache'; import { DocsBuilder, shouldCheckForUpdate } from '../DocsBuilder'; import { DocsSynchronizer, DocsSynchronizerSyncOpts } from './DocsSynchronizer'; @@ -74,12 +76,17 @@ describe('DocsSynchronizer', () => { } as unknown as jest.Mocked; let docsSynchronizer: DocsSynchronizer; + const mockResponseHandler: jest.Mocked = { log: jest.fn(), finish: jest.fn(), error: jest.fn(), }; + const mockBuildLogTransport = new winston.transports.Stream({ + stream: new PassThrough(), + }); + beforeEach(async () => { publisher.docsRouter.mockReturnValue(() => {}); discovery.getBaseUrl.mockImplementation(async type => { @@ -90,6 +97,7 @@ describe('DocsSynchronizer', () => { publisher, config: new ConfigReader({}), logger: getVoidLogger(), + buildLogTransport: mockBuildLogTransport, scmIntegrations: ScmIntegrations.fromConfig(new ConfigReader({})), cache, }); @@ -289,6 +297,7 @@ describe('DocsSynchronizer', () => { techdocs: { legacyUseCaseSensitiveTripletPaths: true }, }), logger: getVoidLogger(), + buildLogger: getVoidLogger(), scmIntegrations: ScmIntegrations.fromConfig(new ConfigReader({})), cache, }); @@ -321,5 +330,22 @@ describe('DocsSynchronizer', () => { expect(mockResponseHandler.finish).toBeCalledWith({ updated: false }); }); + + it('should log to the build logger', async () => { + let logger: winston.Logger; + MockedDocsBuilder.prototype.build.mockImplementation(async () => { + logger = MockedDocsBuilder.mock.calls[0][0].logger; + expect(logger.transports).toContain(mockBuildLogTransport); + + return true; + }); + + await docsSynchronizer.doSync({ + responseHandler: mockResponseHandler, + entity, + preparers, + generators, + }); + }); }); }); diff --git a/plugins/techdocs-backend/src/service/DocsSynchronizer.ts b/plugins/techdocs-backend/src/service/DocsSynchronizer.ts index 9f3f92fbb0..6c377381e0 100644 --- a/plugins/techdocs-backend/src/service/DocsSynchronizer.ts +++ b/plugins/techdocs-backend/src/service/DocsSynchronizer.ts @@ -43,7 +43,7 @@ export type DocsSynchronizerSyncOpts = { export class DocsSynchronizer { private readonly publisher: PublisherBase; private readonly logger: winston.Logger; - private readonly buildLogger: winston.Logger; + private readonly buildLogTransport: winston.transport; private readonly config: Config; private readonly scmIntegrations: ScmIntegrationRegistry; private readonly cache: TechDocsCache | undefined; @@ -51,21 +51,21 @@ export class DocsSynchronizer { constructor({ publisher, logger, - buildLogger, + buildLogTransport, config, scmIntegrations, cache, }: { publisher: PublisherBase; logger: winston.Logger; - buildLogger: winston.Logger; + buildLogTransport: winston.transport; config: Config; scmIntegrations: ScmIntegrationRegistry; cache: TechDocsCache | undefined; }) { this.config = config; this.logger = logger; - this.buildLogger = buildLogger; + this.buildLogTransport = buildLogTransport; this.publisher = publisher; this.scmIntegrations = scmIntegrations; this.cache = cache; @@ -100,7 +100,7 @@ export class DocsSynchronizer { }); taskLogger.add(new winston.transports.Stream({ stream: logStream })); - taskLogger.add(this.buildLogger); + taskLogger.add(this.buildLogTransport); // check if the last update check was too recent if (!shouldCheckForUpdate(entity.metadata.uid!)) { diff --git a/plugins/techdocs-backend/src/service/router.ts b/plugins/techdocs-backend/src/service/router.ts index 36a095f813..ca887efce2 100644 --- a/plugins/techdocs-backend/src/service/router.ts +++ b/plugins/techdocs-backend/src/service/router.ts @@ -30,7 +30,6 @@ import { import express, { Response } from 'express'; import Router from 'express-promise-router'; import { Knex } from 'knex'; -import { createLogger, Logger } from 'winston'; import { ScmIntegrations } from '@backstage/integration'; import { DocsSynchronizer, DocsSynchronizerSyncOpts } from './DocsSynchronizer'; import { createCacheMiddleware, TechDocsCache } from '../cache'; @@ -39,6 +38,8 @@ import { DefaultDocsBuildStrategy, DocsBuildStrategy, } from './DocsBuildStrategy'; +import * as winston from 'winston'; +import { PassThrough } from 'stream'; /** * Required dependencies for running TechDocs in the "out-of-the-box" @@ -50,13 +51,13 @@ export type OutOfTheBoxDeploymentOptions = { preparers: PreparerBuilder; generators: GeneratorBuilder; publisher: PublisherBase; - logger: Logger; + logger: winston.Logger; discovery: PluginEndpointDiscovery; database?: Knex; // TODO: Make database required when we're implementing database stuff. config: Config; cache: PluginCacheManager; docsBuildStrategy?: DocsBuildStrategy; - buildLogger?: Logger; + buildLogTransport?: winston.transport; }; /** @@ -67,12 +68,12 @@ export type OutOfTheBoxDeploymentOptions = { */ export type RecommendedDeploymentOptions = { publisher: PublisherBase; - logger: Logger; + logger: winston.Logger; discovery: PluginEndpointDiscovery; config: Config; cache: PluginCacheManager; docsBuildStrategy?: DocsBuildStrategy; - buildLogger?: Logger; + buildLogTransport?: winston.transport; }; /** @@ -109,11 +110,9 @@ export async function createRouter( const catalogClient = new CatalogClient({ discoveryApi: discovery }); const docsBuildStrategy = options.docsBuildStrategy ?? DefaultDocsBuildStrategy.fromConfig(config); - const buildLogger = - options.buildLogger ?? - createLogger({ - silent: true, - }); + const buildLogTransport = + options.buildLogTransport ?? + new winston.transports.Stream({ stream: new PassThrough() }); // Entities are cached to optimize the /static/docs request path, which can be called many times // when loading a single techdocs page. @@ -134,7 +133,7 @@ export async function createRouter( const docsSynchronizer = new DocsSynchronizer({ publisher, logger, - buildLogger, + buildLogTransport, config, scmIntegrations, cache,