Code Monkey home page Code Monkey logo

nestjs-winston-logger's Introduction

Description

Nest framework TypeScript starter repository.

Installation

$ yarn add nestjs-winston-logger

QuickStart

To use it globally and log any response

import { NestFactory } from "@nestjs/core";
import { AppModule } from "./app.module";
import {
  NestjsWinstonLoggerService,
  appendRequestIdToLogger,
  LoggingInterceptor,
  morganRequestLogger,
  morganResponseLogger,
  appendIdToRequest
} from "nestjs-winston-logger";

import { format, transports } from "winston";
import * as helmet from "helmet";

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.use(helmet());

  const globalLogger = new NestjsWinstonLoggerService({
    format: format.combine(
      format.timestamp({ format: "isoDateTime" }),
      format.json(),
      format.colorize({ all: true }),
    ),
    transports: [
      new transports.File({ filename: "error.log", level: "error" }),
      new transports.File({ filename: "combined.log" }),
      new transports.Console(),
    ],
  });
  app.useLogger(globalLogger);

  // append id to identify request
  app.use(appendIdToRequest);
  app.use(appendRequestIdToLogger(globalLogger));

  app.use(morganRequestLogger(globalLogger));
  app.use(morganResponseLogger(globalLogger));

  app.useGlobalInterceptors(new LoggingInterceptor(globalLogger));

  const port = process.env.PORT || 4000;
  await app.listen(port).then(() => {
    console.log(`๐Ÿš€ Server ready at ${port}`);
  });
}
bootstrap();

To use it inside module

Inside demo.module.ts

import { Module } from "@nestjs/common";
import { NestjsWinstonLoggerModule } from "nestjs-winston-logger";
import { format, transports } from "winston";
import { DemoService } from "./demo.service";

@Module({
  imports: [
    NestjsWinstonLoggerModule.forRoot({
      format: format.combine(
        format.timestamp({ format: "isoDateTime" }),
        format.json(),
        format.colorize({ all: true }),
      ),
      transports: [
        new transports.File({ filename: "error.log", level: "error" }),
        new transports.File({ filename: "combined.log" }),
        new transports.Console(),
      ],
    }),
  ],
  providers: [DemoService],
})
export class DemoModule {}

Inside demo.service.ts

import { Injectable } from "@nestjs/common";
import { NestjsWinstonLoggerService, InjectLogger } from "nestjs-winston-logger";

@Injectable()
export class DemoService {
  constructor(@InjectLogger(DemoService.name) private logger: NestjsWinstonLoggerService) {}
}

License

Nest is MIT licensed.

nestjs-winston-logger's People

Contributors

marcotsept avatar owen1002 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

nestjs-winston-logger's Issues

Use decorator to setContext

import { InjectLogger, NestjsWinstonLoggerService } from 'nestjs-winston-logger';

export class DemoService {
  constructor(@InjectLogger(DemoService.name) private logger: NestjsWinstonLoggerService) {}
}

In my imagination, setContext inside at decorator may be more convenient.

nest v8

did you plan to upgrade this module to be compatible with nestjs v8?

Question: Is it possible to have different loggers with different transports?

Before I start, I just wanted to say great library. I learned a bit more about using nest from looking at your code.

Anyway, from what I can tell, we can create several different loggers using @InjectLogger("someContext") but they all share the same configuration from single global logger. What I need to be able to do is create different loggers that write different things to different files.

Specifically, I would like a separate request log for the API requests, authentication log, error log, and debug log. The error log and debug log can share the same config since the only difference is log level but the authentication log and request log are entirely different things and I don't want information from there going into a debug log.

I assumed that I could do something like @InjectLogger(AUTH_LOG) and @InjectLogger(REQ_LOG) to create the logs, but don't quite see how to configure them.

Enhance middleware more easily for different logger

I found another issue as well. In addition to having different loggers, I want to have a request id across all logs. There is a great method to do this for a global log but if I want to do it for specific logs, my first approach is:

const requestLogger = new NestjsWinstonLoggerService({
    format:format.simple(),
    transports: [
      new transports.File({ filename: "request.log",
      format: format.printf(log => log.message.trim()) }),
    ],
  });

  let authLog = app.get(getLoggerToken(AUTH_LOG));

  app.use(appendIdToRequest);

  app.use(appendRequestIdToLogger(requestLogger));
  app.use(appendRequestIdToLogger(authLog));
  
  configMorgan.appendMorganToken("reqId", TOKEN_TYPE.Request, "reqId");
  app.use(morganRequestLogger(requestLogger));
  app.use(morganResponseLogger(requestLogger));

The issue here is that I'm now exposing some of the internals through getLoggerToken. I think there should be a better way to do this but I haven't thought much about it yet.

This issue may adopt to use Nestjs middleware rather than global middleware. We can open another issue for further discussion. For you reference - https://docs.nestjs.com/middleware

Originally posted by @Marcotsept in #8 (comment)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.