EWL (express-winston-logger) provides common defaults for logging in an express application using winston. It is pre-configured with request tracing enabled and extends some of the features provided by express-winston, e.g. body blacklisting redaction.
yarn add ewl
import { Ewl } from 'ewl';
const ewl = new Ewl();
ewl.debug('This logs to the console by default.');
index.ts
:
import { Application } from 'express';
import { ewl, initEwl } from './logger';
const app = express() as Application;
initEwl(app);
const port = 3000;
app.listen(port, () => {
ewl.debug(`App: Listening on port ${port}!`);
});
logger/index.ts
:
import { Application } from 'express';
import { Ewl, LogLevel } from 'ewl';
export let ewl: Ewl;
export function initEwl(app: Application): void {
ewl = new Ewl({
enableRequestLogging: true,
environment: process.env.ENVIRONMENT || 'development',
label: 'app',
logLevel: (process.env.LOG_LEVEL as LogLevel) || 'error',
useLogstashFormat: false,
version: process.env.VERSION || 'unknown',
});
// Use context middleware to inject the request id.
app.use(ewl.contextMiddleware);
// Use request middleware to inject express metadata.
app.use(ewl.requestMiddleware);
}
main.ts
:
import { NestFactory } from '@nestjs/core';
import { Ewl, LogLevel } from 'ewl';
import { AppModule } from './app.module';
async function bootstrap() {
const ewl = new Ewl({
enableRequestLogging: true,
environment: process.env.ENVIRONMENT || 'development',
label: 'app',
logLevel: (process.env.LOG_LEVEL as LogLevel) || 'error',
useLogstashFormat: false,
version: process.env.VERSION || 'unknown',
});
// Set the default NestJS logger, allowing EWL to be the proxy.
const app = await NestFactory.create(AppModule, { logger: ewl });
// Use context middleware to inject the request id.
app.use(ewl.contextMiddleware);
// Use request middleware to inject express metadata.
app.use(ewl.requestMiddleware);
ewl.debug('Starting application on localhost:3000');
await app.listen(3000, 'localhost');
}
bootstrap();
const ewl = new Ewl({
enableRequestLogging: false,
requestLoggingOptions: {
bodyBlacklist: ['accessToken', 'password', 'refreshToken'],
colorize: true,
expressFormat: true,
headerBlacklist: ['cookie', 'token'],
meta: true,
metaField: 'express',
requestWhitelist: ['body', 'headers', 'method', 'params', 'query', 'url'],
responseWhitelist: ['body', 'headers', 'statusCode'],
statusLevels: true,
},
});
// Use request middleware to inject express metadata.
app.use(ewl.requestMiddleware);
MIT License
Contributions are encouraged, please see further details below:
Here are some basic rules to follow to ensure timely addition of your request:
- Match coding style (braces, spacing, etc.).
- If it is a feature, bugfix, or anything please only change the minimum amount of code required to satisfy the change.
- Please keep PR titles easy to read and descriptive of changes, this will make them easier to merge.
- Pull requests must be made against the
main
branch. Any other branch (unless specified by the maintainers) will get rejected. - Check for existing issues first, before filing a new issue.