1. 内置日志模块的使用
import { Logger} from '@nestjs/common';
@Controller('user')
export class UserController {
private logger = new Logger('UserController');
constructor(private readonly userService: UserService) {}
@Get()
getHello() {
this.logger.log('UserController getHello');
return this.userService.getHello();
}
}
2. nestjs-pino日志模块的使用网址
1.安装
pnpm i nestjs-pino pino-http
main.ts 文件
import { Logger } from 'nestjs-pino';
const app = await NestFactory.create(AppModule, { bufferLogs: true });
app.useLogger(app.get(Logger));
app.module.ts 文件
import { LoggerModule } from 'nestjs-pino';
@Module({
imports: [LoggerModule.forRoot()],
})
class AppModule {}
内置logger的使用
// NestJS standard built-in logger.
// Logs will be produced by pino internally
import { Logger } from '@nestjs/common';
export class MyService {
private readonly logger = new Logger(MyService.name);
foo() {
// All logger methods have args format the same as pino, but pino methods
// `trace` and `info` are mapped to `verbose` and `log` to satisfy
// `LoggerService` interface of NestJS:
this.logger.verbose({ foo: 'bar' }, 'baz %s', 'qux');
this.logger.debug('foo %s %o', 'bar', { baz: 'qux' });
this.logger.log('foo');
}
}
3. 日志格式化插件 pino-pretty 和线上日志滚动记录插件 pino-roll
pnpm install pino-pretty pino-roll
app.module.ts文件在 imports: []里面配置 pino-pretty和pino-roll
import { LoggerModule } from 'nestjs-pino';
import { join } from 'path';
LoggerModule.forRoot({
pinoHttp: {
transport: {
targets: [
process.env.NODE_ENV === 'development'
? {
target: 'pino-pretty',
options: {
colorize: true,
ignore: 'pid,hostname',
},
}
: {
target: 'pino-roll',
options: {
// level: 'info',
file: join('logs', 'log.txt'),
frequency: 'daily',
size: '10m',
mkdir: true,
},
},
],
},
},
}),
ps:使用process.env.NODE_ENV要安装插件 cross-env 笔者使用版本7.0.3
package.json文件配置运行脚本命令 "start": "cross-env NODE_ENV=development nest start --watch"
4.nest-winston的使用(除了pino日志库,也可以使用nest-winston、winston)
pnpm i nest-winston winston
日志滚动存放插件库 winston-daily-rotate-file
pnpm i winston-daily-rotate-file
main.ts文件配置
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
// import { Logger } from 'nestjs-pino';
import { createLogger } from 'winston';
import 'winston-daily-rotate-file';
import * as winston from 'winston'; // 引入winston,必须这么写
import { WinstonModule, utilities } from 'nest-winston';
async function bootstrap() {
// app.useLogger(app.get(Logger));
const instance = createLogger({
transports: [
new winston.transports.Console({
format: winston.format.combine(
winston.format.timestamp(),
utilities.format.nestLike(),
),
}),
new winston.transports.DailyRotateFile({
dirname: 'logs',
filename: 'application-%DATE%.log',
datePattern: 'YYYY-MM-DD-HH',
zippedArchive: true,
maxSize: '20m',
maxFiles: '14d',
}),
],
});
const app = await NestFactory.create(AppModule, {
logger: WinstonModule.createLogger(instance),
});
// app.useLogger(app.get(WINSTON_MODULE_NEST_PROVIDER));
await app.listen(3000);
if (module.hot) {
module.hot.accept();
module.hot.dispose(() => app.close());
}
}
bootstrap();
app.module.ts文件配置
import { Global, Logger, Module } from '@nestjs/common';
@Global() //全局导入方法
@Module({
imports: [
controllers: [],
providers: [Logger],
exports: [Logger],
})
在代码中使用例如:user.controller.ts文件
import { Controller, Logger } from '@nestjs/common';
import { UserService } from './user.service';
export class UserController {
// private logger = new Logger('UserController');
constructor(
private readonly userService: UserService,
private readonly logger: Logger,
) {
// this.logger.log('UserController getHello....');
}
@Get()
getHello() {
this.logger.log('UserController getHello....');
return this.userService.getHello();
}
}