Merge pull request #6534 from carlo-colombo/master

Adds configuration for request logging handler when creating the backend express app
This commit is contained in:
Ben Lambert
2021-07-20 14:44:55 +02:00
committed by GitHub
5 changed files with 53 additions and 4 deletions
+15
View File
@@ -0,0 +1,15 @@
---
'@backstage/backend-common': patch
---
It's possible to customize the request logging handler when building the service. For example in your `backend`
```
const service = createServiceBuilder(module)
.loadConfig(config)
.setRequestLoggingHandler((logger?: Logger): RequestHandler => {
const actualLogger = (logger || getRootLogger()).child({
type: 'incomingRequest',
});
return expressWinston.logger({ ...
```
+11
View File
@@ -439,6 +439,13 @@ export type ReadTreeResponseFile = {
// @public
export function requestLoggingHandler(logger?: Logger_2): RequestHandler;
// Warning: (ae-missing-release-tag) "RequestLoggingHandlerFactory" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal)
//
// @public (undocumented)
export type RequestLoggingHandlerFactory = (
logger?: Logger_2,
) => RequestHandler;
// Warning: (ae-missing-release-tag) "resolvePackagePath" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal)
//
// @public
@@ -492,6 +499,9 @@ export type ServiceBuilder = {
enableCors(options: cors.CorsOptions): ServiceBuilder;
setHttpsSettings(settings: HttpsSettings): ServiceBuilder;
addRouter(root: string, router: Router | RequestHandler): ServiceBuilder;
setRequestLoggingHandler(
requestLoggingHandler: RequestLoggingHandlerFactory,
): ServiceBuilder;
start(): Promise<Server>;
};
@@ -593,6 +603,7 @@ export function useHotMemoize<T>(_module: NodeModule, valueFactory: () => T): T;
// src/service/types.d.ts:57:5 - (ae-forgotten-export) The symbol "HttpsSettings" needs to be exported by the entry point index.d.ts
// src/service/types.d.ts:61:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen
// src/service/types.d.ts:62:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen
// src/service/types.d.ts:70:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen
// (No @packageDocumentation comment for this package)
```
+1 -1
View File
@@ -16,4 +16,4 @@
export { createServiceBuilder } from './createServiceBuilder';
export { createStatusCheckRouter } from './createStatusCheckRouter';
export type { ServiceBuilder } from './types';
export type { ServiceBuilder, RequestLoggingHandlerFactory } from './types';
@@ -27,9 +27,9 @@ import { getRootLogger } from '../../logging';
import {
errorHandler,
notFoundHandler,
requestLoggingHandler,
requestLoggingHandler as defaultRequestLoggingHandler,
} from '../../middleware';
import { ServiceBuilder } from '../types';
import { RequestLoggingHandlerFactory, ServiceBuilder } from '../types';
import {
CspOptions,
HttpsSettings,
@@ -65,6 +65,7 @@ export class ServiceBuilderImpl implements ServiceBuilder {
private cspOptions: Record<string, string[] | false> | undefined;
private httpsSettings: HttpsSettings | undefined;
private routers: [string, Router][];
private requestLoggingHandler: RequestLoggingHandlerFactory | undefined;
// Reference to the module where builder is created - needed for hot module
// reloading
private module: NodeModule;
@@ -144,6 +145,13 @@ export class ServiceBuilderImpl implements ServiceBuilder {
return this;
}
setRequestLoggingHandler(
requestLoggingHandler: RequestLoggingHandlerFactory,
) {
this.requestLoggingHandler = requestLoggingHandler;
return this;
}
async start(): Promise<http.Server> {
const app = express();
const {
@@ -160,7 +168,9 @@ export class ServiceBuilderImpl implements ServiceBuilder {
app.use(cors(corsOptions));
}
app.use(compression());
app.use(requestLoggingHandler(logger));
app.use(
(this.requestLoggingHandler ?? defaultRequestLoggingHandler)(logger),
);
for (const [root, route] of this.routers) {
app.use(root, route);
}
@@ -85,8 +85,21 @@ export type ServiceBuilder = {
*/
addRouter(root: string, router: Router | RequestHandler): ServiceBuilder;
/**
* Set the request logging handler
*
* If no handler is given the default one is used
*
* @param requestLoggingHandler a factory function that given a logger returns an handler
*/
setRequestLoggingHandler(
requestLoggingHandler: RequestLoggingHandlerFactory,
): ServiceBuilder;
/**
* Starts the server using the given settings.
*/
start(): Promise<Server>;
};
export type RequestLoggingHandlerFactory = (logger?: Logger) => RequestHandler;