徐州网站建设报价,潜水艇官方网站代理,python开发订阅号,青岛建个网站多少钱nest日志
三种node服务端日志选型
winstonpinolog4js
2023年5月23日
看star数#xff1a;winston pino log4js
使用体验#xff1a;
pino 格式简洁#xff0c;速度快#xff0c;支持输入日志到任意数据库#xff0c;日志暂无自动清理#xff08;可能是我…nest日志
三种node服务端日志选型
winstonpinolog4js
2023年5月23日
看star数winston pino log4js
使用体验
pino 格式简洁速度快支持输入日志到任意数据库日志暂无自动清理可能是我方式不对知道的朋友评论下告诉我十分感谢~winston 通用稳定日志可自动清理。log4js 不知为啥不想使用除非你劝我。
pino
目前使用 pino npm install pino nestjs-pino pino-http npm install nanoid npm install pino-pretty -D npm install pino-roll -D pino-pretty: 格式化用 pino-roll: 日志设置文件大小分割周期日志名。
特点
Pino的内部架构基于Worker Threads配置简单支持日志类型指定输出到不同文件(会导致速度慢)支持输出日志到任意数据库中
问题日志需要自己做定时任务清理避免占用内存。
main.ts
import { Logger } from nestjs-pino;
const app await NestFactory.createNestExpressApplication(AppModule, {bufferLogs: true, // 使用外部的日志包pino});app.useLogger(app.get(Logger));app.flushLogs();logger.config.ts
import { nanoid } from nanoid;
import type { Request } from express;
import { IncomingMessage } from http;
import type { Params } from nestjs-pino;
import { multistream } from pino;
import type { ReqId } from pino-http;
import { join } from path;
import { format } from date-fns;
const passUrl new Set([./health]);
export const loggerOptions: Params {pinoHttp: [{// https://getpino.io/#/docs/api?idtimestamp-boolean-functionquietReqLogger: true,genReqId: (req: IncomingMessage): ReqId (Requestreq).header(X-Request-id) || nanoid(),...(process.env.NODE_ENV production? {// https://www.npmjs.com/package/pino-rolllevel: error,transport: {target: pino-roll,options: {file: join(logs, log),size: 10m,// 周期frequency: daily,mkdir: true,extension: .${format(new Date(), yyyy-MM-dd)}.json,},},}: {level: debug,transport: {// https://github.com/pinojs/pino-prettytarget: pino-pretty,options: { sync: true, colorize: true },// options: { sync: true, singleLine: true, colorize: true }, // 生产环境再设置压缩为一行},}),autoLogging: {ignore: (req: IncomingMessage) passUrl.has((Requestreq).originalUrl),},},multistream([{ level: debug, stream: process.stdout },{ level: error, stream: process.stdout },{ level: fatal, stream: process.stdout },],{ dedupe: true }, // 删除重复输出),],
};其他设置模式不如上面的设置少了日志分割和文件大小配置但pino还有流操作里面可以写逻辑自己写怎么分割日志或者限制文件大小等等于自配。
// 1. pino/file
const file process.cwd() /logs/log-${format(new Date(), yyyy-MM-dd)}.json;
{level: info,transport: {target: pino/file,options: {destination: file, // 1 是直接输出 2是错误时输出其他为自己设置的目录文件mkdir: true,},},
}
// 使用内置的pino/file传输和使用pino.destination的区别在于pino.destination在主线程中运行而pino/file在工作线程中设置pino.destimation// 2. pino/file
target: pino-pretty,
使用 winston
[nest-winston][nest-winston] 日志记录[winston-daily-rotate-file][winston-daily-rotate-file] 配置生产环境日志 npm install --save nest-winston winston npm install winston-daily-rotate-file 采用[bootstrap配置方式][replacing-the-nest-logger-also-for-bootstrapping]
main.ts
const app await NestFactory.createNestExpressApplication(AppModule, {logger: WinstonModule.createLogger({instance: createLogger({ ...loggerOptions }),}),
});logger.config.ts
import * as winston from winston;
import { utilities as nestWinstonModuleUtilities } from nest-winston;
import DailyRotateFile from winston-daily-rotate-file;
const format (label?: string) {switch (label) {case isDev:return {format: winston.format.combine(winston.format.timestamp(),winston.format.ms(),nestWinstonModuleUtilities.format.nestLike(nestBk, {colors: true,prettyPrint: true,}),),};default:return {format: winston.format.combine(winston.format.timestamp(),winston.format.ms(),),};}
};
const prodLoggerConfig [new DailyRotateFile({level: warn,filename: nestBk-%DATE%.log,dirname: logs,datePattern: YYYY-MM-DD-HH,maxSize: 20m,maxFiles: 14d,zippedArchive: true,...format(),}),new DailyRotateFile({level: info,filename: info-%DATE%.log,dirname: logs,datePattern: YYYY-MM-DD-HH,maxSize: 20m,maxFiles: 14d,zippedArchive: true,...format(),}),
];export const loggerOptions {transports: [new winston.transports.Console({level: info,...format(isDev),}),...(IsProMode ? prodLoggerConfig : []),],
};
使用时 xxx.module.ts providers: [CatsService, Logger],xxx.controller.ts import { Logger } from nestjs/common;private readonly logger: Logger,this.logger.log(请求成功);this.logger.warn(请求警告);this.logger.error(请求错误);样式没啥变化反而喜欢pino的简洁样式
主要是多了个自动到期删除的配置不用自己手动删除日志
QA:
nanoid esm 问题直接降级处理 官方issues “nanoid”: “^.4.x.x” “nanoid”: “^3.3.6”, 参考