发布于2026-07-16 阅读(0)
扫一扫,手机访问
在Ubuntu环境下调试Node.js应用时,日志输出往往是最直接的信息来源。但默认的console.log实在有点“素”——既没有时间戳,也看不出级别,排查问题全靠肉眼硬翻。好在自定义日志输出并不复杂,下面几招,足以帮你把日志打理得井井有条。

console.log搭个自定义格式化函数如果只是临时调试或者项目规模不大,完全不需要引入第三方库。自己写个格式化函数,就能给日志加上时间戳和级别标签。
function customLog(message, level = 'info') {
const timestamp = new Date().toISOString();
console.log(`[${timestamp}] [${level.toUpperCase()}] ${message}`);
}
// 使用自定义日志函数
customLog('This is an info message');
customLog('This is a warning message', 'warn');
customLog('This is an error message', 'error');
这样输出的日志会带上[2025-04-22T10:30:00.000Z] [INFO] ...这样的格式,一眼就能看出发生时间。当然,如果你想要更丰富的功能——比如按级别写文件、输出到远程服务器——那就轮到第三方库上场了。
试试winston: 安装只需一行命令:npm install winston。配置一个Logger实例,就能同时往控制台和文件输出日志,而且格式可以统一管理。
const winston = require('winston');
const logger = winston.createLogger({
level: 'info',
format: winston.format.combine(
winston.format.timestamp(),
winston.format.printf(({ timestamp, level, message }) => {
return `[${timestamp}] [${level.toUpperCase()}] ${message}`;
})
),
transports: [
new winston.transports.Console(),
new winston.transports.File({ filename: 'error.log', level: 'error' }),
new winston.transports.File({ filename: 'combined.log' })
]
});
logger.info('This is an info message');
logger.warn('This is a warning message');
logger.error('This is an error message');
这套配置把error级别的日志单独写到error.log,所有级别的日志汇总到combined.log,控制台同时输出可视信息。开发调试和线上监控都能兼顾。
很多时候需要在服务器上保留日志历史,方便事后回溯。直接写文件是最朴素也最可靠的方式。先创建一个日志文件:touch app.log,然后封装一个写文件函数。
const fs = require('fs');
const path = require('path');
const logFile = path.join(__dirname, 'app.log');
function logToFile(message, level = 'info') {
const timestamp = new Date().toISOString();
const logEntry = `[${timestamp}] [${level.toUpperCase()}] ${message}\n`;
fs.appendFile(logFile, logEntry, (err) => {
if (err) throw err;
});
}
// 使用日志函数
logToFile('This is an info message');
logToFile('This is a warning message', 'warn');
logToFile('This is an error message', 'error');
这种方式特别适合不需要复杂日志轮转的场景。当然,如果日志量很大,建议用winston自带的File传输通道,它支持按大小、按时间自动分割文件。
同一个应用,开发时想看到所有debug信息,线上却只想输出warn以上级别。怎么做?最简单的方法就是读取环境变量。先设置环境变量:
export LOG_LEVEL=info
然后在代码中获取这个变量,传给日志库:
const winston = require('winston');
const logLevel = process.env.LOG_LEVEL || 'info';
const logger = winston.createLogger({
level: logLevel,
format: winston.format.combine(
winston.format.timestamp(),
winston.format.printf(({ timestamp, level, message }) => {
return `[${timestamp}] [${level.toUpperCase()}] ${message}`;
})
),
transports: [
new winston.transports.Console(),
new winston.transports.File({ filename: 'error.log', level: 'error' }),
new winston.transports.File({ filename: 'combined.log' })
]
});
logger.info('This is an info message');
logger.warn('This is a warning message');
logger.error('This is an error message');
这样一来,线上环境设置LOG_LEVEL=warn,info级别的日志就被自动过滤掉了,既节省磁盘空间,又避免无关信息干扰。开发和测试环境则可以设为debug,看到最详细的执行过程。
以上三种方法可以灵活组合:开发阶段用console.log自定义格式快速验证,上线后改用winston加文件输出,再搭配环境变量动态调整级别——一套靠谱的日志体系就搭建起来了。希望这些思路能帮你少走弯路。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8