Logging Chiper
Table of Contents
Description
This simple module offers a way to use some functionalities from the
logging-chiper.
Motivation
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.
Requirements
- Nodejs LTS.
- GOOGLE_APPLICATION_CREDENTIALS defined with the file path as environment
variable.
Usage
Install
npm i logging-chiper -S -E
OR
yarn add logging-chiper -S -E
Initialization
To initialize the logger you need call the init
function at start point of your application, using the following parameters:
import { Logger } from 'logging-chiper';
Logger.init({
projectId: 'your-project-id',
service: 'your-service-name',
version: '0.0.1',
});
Parameters
As we want to standardize the way we log our application, so we defined a base
structure as input parameters to accomplish this:
Logger.getInstance().log({
stt: 'my-stt',
context: 'my-context',
functionName: 'my-function',
message: 'my-message',
data: {
storeId: '' + 123456,
responseCode: '' + 200,
testField: 'test',
extraField: 'extra',
},
});
Logger.getInstance().warn({
stt: 'my-stt',
context: 'my-context',
functionName: 'my-function',
message: 'my-message',
data: {
storeId: '' + 123456,
responseCode: '' + 200,
testField: 'test',
extraField: 'extra',
},
});
Logger.getInstance().error({
stt: 'my-stt',
context: 'my-context',
functionName: 'my-function',
message: 'my-message',
error,
data: {
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.
Examples
Simple Log
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();
Log Requests
With Express
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([
new transports.Console(),
new LoggingWinston({
projectId: "chiper-development",
logName: "myapp"
})
]).then((mw) => {
app.use(mw);
app.get('/info', (req: Request, res: Response) => {
(req as any).log.info("get Hello World!");
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}`);
});
});
With NestJS
- 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([
new transports.Console(),
new LoggingWinston({
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('*');
}
}