温馨提示×

Debian Node.js 日志如何配置

小樊
49
2025-09-18 18:00:02
栏目: 编程语言

Debian系统下Node.js日志配置指南

在Debian系统中,Node.js日志配置需根据生产/开发环境需求选择合适方案,核心目标是将日志结构化、持久化,并实现高效管理。以下是常见配置方法及步骤:

一、基础日志记录:内置console模块

最简单的日志方式是使用Node.js内置的console.log/console.error,适用于开发调试。若需将日志写入文件,可通过重定向或自定义函数实现:

const fs = require('fs'); const path = require('path'); const logFile = path.join(__dirname, 'app.log'); // 自定义日志函数(带时间戳) function logToFile(message) { const timestamp = new Date().toISOString(); const logEntry = `${timestamp}: ${message}\n`; fs.appendFile(logFile, logEntry, (err) => { if (err) throw err; }); } // 重写console.log console.log = (...args) => { const message = args.join(' '); logToFile(message); // 写入文件 process.stdout.write(message + '\n'); // 同时输出到控制台 }; // 示例使用 console.log('Hello, world!'); 

缺点:缺乏日志级别、格式化、轮转等功能,不适合生产环境。

二、使用日志库:Winston/Pino(推荐)

1. Winston(功能全面)

Winston是Node.js最流行的日志库,支持多传输(文件、控制台、Syslog等)、格式化(JSON/文本)和日志级别。

  • 安装npm install winston
  • 配置示例
    const { createLogger, format, transports } = require('winston'); const path = require('path'); const logger = createLogger({ level: process.env.LOG_LEVEL || 'info', // 通过环境变量动态设置级别 format: format.combine( format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }), format.json() // 生产环境建议用JSON格式(便于ELK等工具分析) ), transports: [ new transports.File({ filename: path.join(__dirname, 'logs/error.log'), level: 'error' }), // 错误日志单独存储 new transports.File({ filename: path.join(__dirname, 'logs/combined.log') }), // 所有日志合并 ...(process.env.NODE_ENV !== 'production' ? [ // 开发环境输出到控制台 new transports.Console({ format: format.simple() }) ] : []) ] }); // 示例使用 logger.info('Application started'); logger.error('Database connection failed'); 
  • 优势:灵活、可扩展,支持自定义传输和格式化。

2. Pino(高性能)

Pino专注于高性能,日志输出为JSON格式,适合对性能敏感的生产环境。

  • 安装npm install pino pino-pretty
  • 配置示例
    const pino = require('pino'); const path = require('path'); // 生产环境:写入文件 const logger = pino({ level: 'info' }, pino.destination(path.join(__dirname, 'logs/app.log'))); // 开发环境:输出到控制台(美化格式) if (process.env.NODE_ENV !== 'production') { logger.level = 'debug'; logger = pino({ level: 'debug' }, pino.destination(process.stdout)); } // 示例使用 logger.info('User logged in', { userId: 123 }); logger.error('Invalid API key', { apiKey: 'abc123' }); 
  • 优势:日志输出速度快,资源占用低。

三、日志轮转:防止日志文件过大

使用logrotate工具自动轮转、压缩和删除旧日志,避免日志文件占用过多磁盘空间。

  • 安装sudo apt install logrotate
  • 配置:创建/etc/logrotate.d/nodejs文件,内容如下:
    /path/to/your/nodejs/logs/*.log { daily # 每天轮转 rotate 7 # 保留7天日志 compress # 压缩旧日志(如.gz格式) missingok # 若日志文件不存在也不报错 notifempty # 若日志为空则不轮转 create 0644 root root # 新日志文件权限 } 
  • 测试logrotate -d /etc/logrotate.d/nodejs(模拟运行,检查配置是否正确);logrotate -f /etc/logrotate.d/nodejs(强制立即轮转)。

四、进程管理:PM2集成日志

PM2是Node.js进程管理工具,可自动重启应用并管理日志,适合生产环境。

  • 安装npm install pm2 -g
  • 启动应用并配置日志
    pm2 start app.js --name "my-app" \ --log /var/log/my-app.log \ # 合并日志路径 --error /var/log/my-app-error.log # 错误日志路径 
  • 查看日志pm2 logs my-app(实时日志);pm2 logs my-app --lines 100(查看最近100条)。
  • 配置文件:也可通过ecosystem.config.js配置:
    module.exports = { apps: [{ name: 'my-app', script: 'app.js', error_file: '/var/log/my-app-error.log', out_file: '/var/log/my-app.log', log_date_format: 'YYYY-MM-DD HH:mm Z' }] }; 
  • 优势:自动管理进程、日志分割、支持远程日志(如Logstash)。

五、系统日志集成:Syslog

将Node.js日志发送到Debian系统的Syslog(集中管理所有系统日志),适合需要统一日志管理的场景。

  • 使用Winston-Syslog
    • 安装npm install winston-syslog
    • 配置示例
      const winston = require('winston'); const Syslog = require('winston-syslog').Syslog; const logger = winston.createLogger({ level: 'info', format: winston.format.json(), transports: [ new Syslog({ host: 'localhost', // Syslog服务器地址(本地则为localhost) port: 514, // Syslog端口(默认UDP 514) app_name: 'my-node-app', // 应用名称(在Syslog中标识) facility: 'local0', // 设施类型(如local0-local7) eol: '\n' // 行结束符 }) ] }); // 示例使用 logger.info('Application started', { pid: process.pid }); 
  • 查看Syslogjournalctl -t my-node-app(过滤应用名称);tail -f /var/log/syslog(查看系统日志)。

六、环境变量配置日志级别

通过环境变量动态调整日志级别,无需修改代码即可适应不同环境(开发/测试/生产)。

  • 示例
    const winston = require('winston'); const logger = winston.createLogger({ level: process.env.LOG_LEVEL || 'info', // 默认info级别 format: winston.format.json(), transports: [new winston.transports.Console()] }); // 启动应用时设置环境变量 // 生产环境:LOG_LEVEL=error node app.js // 开发环境:LOG_LEVEL=debug node app.js 
  • 优势:灵活控制日志详细程度,减少生产环境不必要的日志输出。

七、自定义日志存储路径

通过代码或配置文件指定日志存储位置,确保日志文件存放在合适目录(如/var/log)。

  • 代码配置(Winston示例)
    const path = require('path'); const winston = require('winston'); const logger = winston.createLogger({ transports: [ new winston.transports.File({ filename: path.join('/var/log', 'my-app', 'combined.log') // 绝对路径 }) ] }); 
  • 配置文件(config.json)
    { "logPath": "/var/log/my-app/app.log" } 
    代码中读取:
    const config = require('./config.json'); const logPath = path.resolve(__dirname, config.logPath); 
  • 注意事项:确保应用对日志目录有写入权限(如sudo chown -R nodeuser:nodegroup /var/log/my-app)。

以上方法覆盖了Debian系统下Node.js日志配置的主要场景,可根据应用规模、性能需求选择合适的方案。生产环境推荐使用Winston/Pino+PM2+logrotate组合,实现日志的结构化、持久化和高效管理。

0