Ubuntu下Node.js日志级别设置方法
在Ubuntu系统中,Node.js应用程序的日志级别设置主要依赖所使用的日志库(如winston、morgan、bunyan等),常见方式包括代码硬编码、环境变量、配置文件及进程管理工具(如PM2),以下是具体实现方法:
根据项目使用的日志库,在初始化日志记录器时通过level属性指定日志级别。以下是主流日志库的示例:
const winston = require('winston');
const logger = winston.createLogger({
level: 'info', // 设置默认日志级别(可选:'error'、'warn'、'info'、'debug'、'verbose'等)
format: winston.format.combine(
winston.format.timestamp(),
winston.format.printf(({ timestamp, level, message }) => `${timestamp} [${level}]: ${message}`)
),
transports: [
new winston.transports.Console(), // 输出到控制台
new winston.transports.File({ filename: 'error.log', level: 'error' }), // 仅记录error级别到文件
new winston.transports.File({ filename: 'combined.log' }) // 记录所有级别到文件
]
});
logger.debug('Debug message (不会记录,因级别为info)'); // 不会输出
logger.info('Info message (会记录)'); // 会输出
const express = require('express');
const morgan = require('morgan');
const app = express();
// 设置日志级别(预定义格式:'tiny'、'common'、'combined'等)
app.use(morgan('combined')); // 输出详细请求日志(如::method :url :status :response-time ms - :res[content-length])
// 或自定义格式
app.use(morgan(':method :url :status - :response-time ms'));
const bunyan = require('bunyan');
const logger = bunyan.createLogger({
name: 'my-app',
level: 'debug', // 结构化日志级别
serializers: bunyan.stdSerializers // 标准化日志输出(如req/res对象)
});
logger.info({ user: 'admin' }, 'User logged in'); // 输出结构化日志
const pino = require('pino');
const logger = pino({ level: 'info' }); // 高性能JSON日志
logger.debug('Debug message (不会记录)');
logger.info('Info message (会记录)');
注意:修改代码后需重启Node.js应用使配置生效。
通过环境变量动态配置日志级别,避免修改代码,适合生产环境(如Docker、CI/CD流程)。步骤如下:
LOG_LEVEL=debug node app.js # 启动时直接指定环境变量
dotenv库(用于加载.env文件):npm install dotenv
.env文件(项目根目录):LOG_LEVEL=info
require('dotenv').config(); // 加载.env文件
const winston = require('winston');
const logger = winston.createLogger({
level: process.env.LOG_LEVEL || 'info', // 优先读取环境变量,未设置则默认为info
format: winston.format.json(),
transports: [new winston.transports.Console()]
});
注意:环境变量的优先级高于代码中的默认值,修改.env文件后无需重启应用(若使用nodemon等工具会自动重启)。
使用配置文件(如JSON、YAML)管理日志级别,便于团队协作和环境切换(开发/测试/生产)。
config库:npm install config
{
"logging": {
"level": "info",
"transports": {
"console": true,
"file": false
}
}
}
const config = require('config');
const winston = require('winston');
const logger = winston.createLogger({
level: config.get('logging.level'), // 从配置文件读取日志级别
format: winston.format.json(),
transports: [
config.get('logging.transports.console') && new winston.transports.Console(),
config.get('logging.transports.file') && new winston.transports.File({ filename: 'app.log' })
].filter(Boolean) // 过滤掉false值
});
config.json:{
"logLevel": "debug"
}
const fs = require('fs');
const config = JSON.parse(fs.readFileSync('config.json', 'utf8'));
const winston = require('winston');
const logger = winston.createLogger({
level: config.logLevel,
format: winston.format.simple(),
transports: [new winston.transports.Console()]
});
注意:修改配置文件后需重启应用(除非使用热重载工具)。
PM2是Node.js进程管理工具,可通过其配置文件动态设置日志级别,支持日志分割、轮转等功能。
npm install -g pm2
module.exports = {
apps: [
{
name: 'my-app',
script: 'app.js',
env: {
NODE_ENV: 'development',
LOG_LEVEL: 'debug' // 开发环境日志级别
},
env_production: {
NODE_ENV: 'production',
LOG_LEVEL: 'info' // 生产环境日志级别
},
log_date_format: 'YYYY-MM-DD HH:mm Z', // 日志时间格式
out_file: '/var/log/my-app.log', // 标准输出日志路径
error_file: '/var/log/my-app-error.log' // 错误日志路径
}
]
};
pm2 start ecosystem.config.js --env production # 切换到生产环境
pm2 restart my-app --update-env # 重启并应用新环境变量
优势:PM2支持日志分割(按大小/时间)、日志清理、进程守护等功能,适合生产环境。
config库管理配置文件,支持多环境切换。根据项目需求选择合适的方式,确保日志级别设置清晰、可维护。