This simple module offers a way to use some functionalities from the logging-chiper.
As company we want to standardize the way we log our application, so that's we wrote this module to make it easier to log our application.
- Nodejs LTS.
- GOOGLE_APPLICATION_CREDENTIALS defined with the file path as environment variable.
npm i logging-chiper -S -E
OR
yarn add logging-chiper -S -E
To initialize the logger you need call the init
function at start point of your application, using the following parameters:
// import the class from the library
import { Logger } from 'logging-chiper';
Logger.init({
projectId: 'your-project-id',
service: 'your-service-name',
version: '0.0.1',
});
As we want to standardize the way we log our application, so we defined a base structure as input parameters to accomplish this:
// Log method
Logger.getInstance().log({
stt: 'my-stt', // name of the stt owner
context: 'my-context', // name of the class or file (optional)
functionName: 'my-function', // name of the function (optional)
message: 'my-message', // message to log
data: { // data to log (optional)
storeId: '' + 123456,
responseCode: '' + 200,
testField: 'test',
extraField: 'extra',
},
});
// Warn method
Logger.getInstance().warn({
stt: 'my-stt', // name of the stt owner
context: 'my-context', // name of the class or file (optional)
functionName: 'my-function', // name of the function (optional)
message: 'my-message', // message to log
data: { // data to log (optional)
storeId: '' + 123456,
responseCode: '' + 200,
testField: 'test',
extraField: 'extra',
},
});
// Error method
Logger.getInstance().error({
stt: 'my-stt', // name of the stt owner
context: 'my-context', // name of the class or file (optional)
functionName: 'my-function', // name of the function (optional)
message: 'my-message', // message to log
error, // the exception to log that just occurred
data: { // data to log (optional)
storeId: '' + 123456,
responseCode: '' + 200,
testField: 'test',
extraField: 'extra',
},
});
As you can see, all the methods follows almost the same structure, but when you want to log an error, you need to pass the error as parameter.
import { Logger } from 'logging-chiper';
const bootstrap = () => {
Logger.init({
projectId: 'your-project-id',
service: 'your-service-name',
version: '0.0.1',
});
Logger.getInstance().log({
stt: 'solutions',
context: 'main.ts',
functionName: 'bootstrap',
message: 'this is a log message...',
});
};
}
bootstrap();
import { createMiddleware } from 'logging-chiper';
import express, { Request, Response } from 'express';
import { AddressInfo } from 'net';
import { LoggingWinston } from '@google-cloud/logging-winston';
import { transports } from 'winston';
const app = express();
createMiddleware([ // creates the middleware
new transports.Console(), // logs to console
new LoggingWinston({ // logs to gpc
projectId: "chiper-development",
logName: "myapp"
})
]).then((mw) => {
app.use(mw); // setup middler into express
app.get('/info', (req: Request, res: Response) => {
(req as any).log.info("get Hello World!"); // Using log from request
res.status(200).send('Hello World!');
});
const server = app.listen(3000, () => {
const address = (server.address() as AddressInfo)
mw.logger.info(`running at http://${address.address}:${address.port}`); // use the logger from mw.
});
});
- You need the create an interceptor for logging:
app.logmiddleware.ts
import { Injectable, NestMiddleware } from '@nestjs/common';
import { Request, Response, NextFunction } from 'express';
import { createMiddleware } from 'logging-chiper';
import { LoggingWinston } from '@google-cloud/logging-winston';
import { transports } from 'winston';
@Injectable()
export class LoggerMiddleware implements NestMiddleware {
async use(req: Request, res: Response, next: NextFunction) {
const mw = await createMiddleware([ // creates the middleware
new transports.Console(), // logs to console
new LoggingWinston({ // logs to gpc
projectId: "chiper-development",
logName: "myapp"
})
])
mw(req, res, next);
}
}
- And then configure in the module:
app.module.ts
import { MiddlewareConsumer, Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { LoggerMiddleware } from "./app.loggermiddleware";
@Module({
imports: [],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {
configure(consumer: MiddlewareConsumer) {
consumer
.apply(LoggerMiddleware)
.forRoutes('*');
}
}