为nextjs项目添加日志

背景

经常做全栈项目或者做过正式后端项目的开发者都知道,日志记录是一个项目不可或缺的功能。不过,经常看Next.js开源项目的朋友会发现,几乎没什么项目集成了日志模块。

但是,根据我的经验看,Next.js项目还是比较需要日志模块的,根据实际经验总结出来的原因如下有几个:

  • Serverless 平台和自己购买的服务器环境是有区别的,这就带来Next.js项目运行时不同,例如在Serverless 平台里,Next.js使用的是edge运行时,它相比于Node环境来说,缺少了一些API,这会导致偶尔出现本地运行正常,部署到Serverless 平台发现报错了。
  • 调用了第三方平台的API,当出现连接错误的情况,你去排查是第三方服务不稳定还是你的API额度用完,这都是比较麻烦了,但是如果有日志文件直接查看,定位问题就可以更快速。

安装必要Package:

1
npm install winston winston-daily-rotate-file 

添加通用函数:

logger.ts:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import * as fs from 'fs';
import * as winston from 'winston';
import 'winston-daily-rotate-file';

const logDir: string = process.env.LOG_DIR || 'log'; // 使用环境变量或默认值

if (!fs.existsSync(logDir)) {
fs.mkdirSync(logDir, { recursive: true });
}

console.log("logDir",logDir);

const fileTransport = new winston.transports.DailyRotateFile({
filename: `${logDir}/%DATE%-results.log`,
datePattern: 'YYYY-MM-DD',
zippedArchive: true,
maxSize: '20m',
maxFiles: '3d', // 保留3天的日志
level: 'info', // 此传输层记录info及以上级别的日志(info, warning, error)
});

const logger: winston.Logger = winston.createLogger({
level: 'info', // 最低级别
format: winston.format.combine(
winston.format.timestamp({
format: 'YYYY-MM-DD HH:mm:ss'
}),
winston.format.json()
),
transports: [
fileTransport,
new winston.transports.Console({
level: 'info', // 控制台同时也输出所有级别的日志
format: winston.format.combine(
winston.format.colorize(),
winston.format.simple()
)
})
]
});

export default logger;

使用例子

1
2
3
4

import logger from "@/libs/logger";

logger.info("/api/timeblocks POST " + recordDate + " useId: " + currentUserId );

日志文件默认在log文件夹下

请我喝杯咖啡吧~

支付宝
微信