Debian系统中JavaScript(Node.js)日志常见配置错误及解决方案
未启用或配置日志记录功能,导致应用运行时的错误、警告等重要信息无法被记录,无法追溯问题根源。
解决方法:使用成熟的日志库(如winston、pino)配置日志记录,明确指定日志输出目标(文件、控制台)、格式(JSON、文本)和级别(info、error)。例如,使用winston创建基础日志记录器:
const winston = require('winston');
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(),
transports: [
new winston.transports.Console(),
new winston.transports.File({ filename: 'combined.log' })
]
});
日志级别设置过高(如仅记录error),会忽略warn、info等关键信息,导致问题排查困难;或设置过低(如记录debug),产生大量无关日志,影响系统性能。
解决方法:根据环境调整日志级别:开发环境用debug(输出详细信息),生产环境用info或warn(仅记录必要信息)。通过环境变量动态控制级别,例如:
const logLevel = process.env.LOG_LEVEL || 'info';
const logger = winston.createLogger({ level: logLevel, ... });
root专属),导致node进程无法写入。/var/log/my-js-app/),并使用mkdir -p创建;node的用户(如myuser),并赋予写入权限:sudo chown -R myuser:myuser /var/log/my-js-app/
sudo chmod -R 755 /var/log/my-js-app/
未配置日志轮转,单个日志文件持续增长,占用大量磁盘空间(如超过GB级),甚至导致系统崩溃。
解决方法:使用winston-daily-rotate-file库实现日志按日期或大小轮转,自动压缩旧日志并删除过期文件。例如:
const DailyRotateFile = require('winston-daily-rotate-file');
const logger = winston.createLogger({
transports: [
new DailyRotateFile({
filename: 'application-%DATE%.log',
datePattern: 'YYYY-MM-DD',
zippedArchive: true,
maxSize: '20m',
maxFiles: '14d' // 保留14天日志
})
]
});
使用非结构化日志(如纯文本console.log),导致日志难以解析(如无法通过工具提取字段),尤其在分布式系统中无法关联日志。
解决方法:采用结构化日志格式(如JSON),便于日志收集和分析工具(如ELK、Prometheus)处理。例如,winston的JSON格式配置:
const logger = winston.createLogger({
format: winston.format.combine(
winston.format.timestamp(),
winston.format.json()
),
transports: [new winston.transports.Console()]
});
同步日志记录(如默认的console.log)会阻塞业务线程,特别是在高并发场景下,显著降低应用性能(如延迟增加、吞吐量下降)。
解决方法:使用支持异步的日志库(如winston默认异步)或显式配置异步传输。例如,winston的AsyncStorage传输:
const winston = require('winston');
require('winston-async');
const logger = winston.createLogger({
transports: [
new (require('winston-async').AsyncTransport)({
transport: new winston.transports.File({ filename: 'async.log' })
})
]
});
日志中包含敏感数据(如用户密码、API密钥、个人身份信息PII),违反安全规范,可能导致数据泄露风险。
解决方法:在日志记录前过滤敏感字段,使用winston的format功能移除或替换敏感信息。例如:
const sanitize = (info) => {
if (info.message && typeof info.message === 'string') {
info.message = info.message.replace(/password=[^&]+/g, 'password=*****');
}
return info;
};
const logger = winston.createLogger({
format: winston.format.combine(
winston.format.timestamp(),
winston.format.json(),
winston.format(info => sanitize(info))()
),
transports: [new winston.transports.Console()]
});
未安装日志库或其依赖(如winston的transport插件),导致日志功能无法正常工作,出现Cannot find module等错误。
解决方法:在项目根目录下运行npm install或yarn install安装所有依赖,确保package.json中包含所需日志库。例如:
{
"dependencies": {
"winston": "^3.8.2",
"winston-daily-rotate-file": "^4.7.1"
}
}