Debian系统中JS(Node.js)日志常见配置问题及解决方法
问题表现:应用运行时未启用日志功能,关键操作(如请求响应、错误抛出)无记录,无法追踪问题根源。
解决方法:
winston、pino),在代码中初始化日志实例并输出到控制台或文件。例如使用winston的基本配置:const winston = require('winston');
const logger = winston.createLogger({
level: 'info',
transports: [new winston.transports.Console()] // 输出到控制台
});
logger.info('Application started'); // 记录启动信息
logger.info、logger.error)。问题表现:
error):忽略warn、info等关键信息,无法监控应用状态;debug):记录大量无用信息(如请求参数、内部流程),增加磁盘占用和检索难度。debug(输出详细信息),生产环境用info或warn(仅记录重要事件)。LOG_LEVEL=debug node app.js),避免硬编码。例如winston配置:const logLevel = process.env.LOG_LEVEL || 'info'; // 默认info
const logger = winston.createLogger({ level: logLevel });
```。
问题表现:配置的日志文件路径不存在或无写入权限,导致日志无法保存(如Error: EACCES: permission denied)。
解决方法:
/var/log/myapp),可通过mkdir -p /var/log/myapp创建;chown root:adm /var/log/myapp && chmod 640 /var/log/myapp/*.log),允许应用进程写入。问题表现:日志文件持续增长,占用大量磁盘空间(如combined.log达到GB级别),甚至导致系统崩溃。
解决方法:
winston-daily-rotate-file库实现自动轮转:按日期分割日志文件,保留最近14天,压缩旧文件。配置示例:const DailyRotateFile = require('winston-daily-rotate-file');
const logger = winston.createLogger({
transports: [
new DailyRotateFile({
filename: '/var/log/myapp/application-%DATE%.log',
datePattern: 'YYYY-MM-DD',
zippedArchive: true, // 压缩旧文件
maxSize: '20m', // 单个文件最大20MB
maxFiles: '14d' // 保留14天
})
]
});
logrotate(需手动配置/etc/logrotate.d/myapp文件)。问题表现:日志文件权限过宽(如777),导致非授权用户(如黑客)读取敏感信息(如用户密码、请求参数);或权限过严(如600),导致应用无法写入日志。
解决方法:
root),所属组设为adm(系统日志组),权限设为640(所有者可读写,组可读)。例如:chown root:adm /var/log/myapp/*.log
chmod 640 /var/log/myapp/*.log
```。
问题表现:生产环境仍将日志输出到控制台(而非文件),导致日志丢失(如容器重启后控制台日志消失);或未区分错误日志与普通日志(如combined.log包含所有级别,难以检索错误)。
解决方法:
error.log),普通日志输出到combined.log。例如winston配置:const logger = winston.createLogger({
level: 'info',
transports: [
new winston.transports.File({ filename: '/var/log/myapp/error.log', level: 'error' }), // 仅错误日志
new winston.transports.File({ filename: '/var/log/myapp/combined.log' }) // 所有日志
]
});
// 开发环境添加控制台输出
if (process.env.NODE_ENV !== 'production') {
logger.add(new winston.transports.Console({ format: winston.format.simple() }));
}
```。