商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > 如何在Ubuntu上自定义Node.js日志输出

如何在Ubuntu上自定义Node.js日志输出

  发布于2026-07-16 阅读(0)

扫一扫,手机访问

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

如何在Ubuntu上自定义Node.js日志输出

方法一:用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=warninfo级别的日志就被自动过滤掉了,既节省磁盘空间,又避免无关信息干扰。开发和测试环境则可以设为debug,看到最详细的执行过程。

以上三种方法可以灵活组合:开发阶段用console.log自定义格式快速验证,上线后改用winston加文件输出,再搭配环境变量动态调整级别——一套靠谱的日志体系就搭建起来了。希望这些思路能帮你少走弯路。

本文转载于:https://www.yisu.com/ask/86248934.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注