日志库是日志存储策略的核心,需根据性能、功能需求选择:
winston-daily-rotate-file插件实现日志轮转,适合需要高度定制的场景。pino-rotate可实现日志分割与压缩。日志轮转是防止日志文件过大、占用过多磁盘空间的关键手段,常见方式如下:
filename(如application-%DATE%.log)、datePattern(如YYYY-MM-DD)、maxSize(如20m,单个文件最大20MB)、maxFiles(如14d,保留14天)、zippedArchive(如true,压缩旧日志)。示例代码:const winston = require('winston'); const DailyRotateFile = require('winston-daily-rotate-file'); const logger = winston.createLogger({ transports: [ new DailyRotateFile({ filename: 'logs/application-%DATE%.log', datePattern: 'YYYY-MM-DD', zippedArchive: true, maxSize: '20m', maxFiles: '14d' }) ] }); period(如1d,每天轮转)、path(如logs/application.log)、maxsize(如10m)、maxfiles(如7)。示例代码:const pino = require('pino'); const pinoRotate = require('pino-rotate'); const logger = pino({}, pinoRotate({ period: '1d', path: 'logs/application.log', maxsize: '10m', maxfiles: '7' })); logrotate是Linux自带的日志管理工具,支持按大小、时间轮转,配置灵活。步骤如下:
/etc/logrotate.d/nodejs-app):/path/to/your/app/*.log { daily # 每天轮转 rotate 14 # 保留14天 compress # 压缩旧日志(gzip) delaycompress # 延迟压缩(避免当天日志被压缩) missingok # 文件不存在时不报错 notifempty # 文件为空时不轮转 create 640 root adm # 创建新日志文件并设置权限 } sudo logrotate -f /etc/logrotate.d/nodejs-app。合理划分日志级别可提高日志的可读性与排查效率:
error(错误,需立即处理)、warn(警告,潜在问题)、info(常规信息,如服务启动)、debug(调试,详细流程)、trace(追踪,最低级别,用于详细排查)。info(避免过多调试日志影响性能),开发环境设置为debug(便于排查问题)。示例(Winston):const logger = winston.createLogger({ level: process.env.NODE_ENV === 'production' ? 'info' : 'debug', transports: [new winston.transports.Console()] }); 对于分布式系统,集中式日志管理可统一存储、分析与检索日志:
winston-elasticsearch库将日志发送到Elasticsearch:const winston = require('winston'); const Elasticsearch = require('winston-elasticsearch'); const logger = winston.createLogger({ transports: [ new Elasticsearch({ level: 'info', clientOpts: { node: 'http://localhost:9200' } }) ] }); debug/trace级别,仅记录必要信息(如error、warn)。zippedArchive(Winston)或compress(logrotate),减少存储空间占用。/var/log/nodejs/),便于管理与备份。640,所有者可读写,组用户可读),避免敏感信息泄露。示例:sudo mkdir -p /var/log/nodejs/ sudo chown root:adm /var/log/nodejs/ sudo chmod 640 /var/log/nodejs/*