Linux下JS日志优化实操指南
一 核心策略与优先级
二 落地配置示例
使用 Pino(高性能、默认异步)
// 安装:npm i pino
const pino = require('pino');
const logger = pino({
level: process.env.LOG_LEVEL || 'info',
transport: process.env.NODE_ENV === 'development'
? { target: 'pino-pretty', options: { colorize: true } }
: undefined, // 生产输出JSON
base: { pid: false }, // 可按需增减字段
timestamp: pino.stdTimeFunctions.isoTime
});
logger.info({ event: 'user.login', userId: 'u123', ip: '192.168.1.10' });
logger.error({ err: new Error('boom'), ctx: 'auth' }, 'login failed');
使用 Winston(功能全面、易扩展)
// 安装:npm i winston winston-daily-rotate-file
const winston = require('winston');
const DailyRotateFile = require('winston-daily-rotate-file');
const logger = winston.createLogger({
level: process.env.LOG_LEVEL || 'info',
format: winston.format.combine(
winston.format.timestamp(),
winston.format.json()
),
transports: [
new DailyRotateFile({
filename: 'logs/app-%DATE%.log',
datePattern: 'YYYY-MM-DD',
zippedArchive: true,
maxSize: '20m',
maxFiles: '14d'
}),
new winston.transports.Console({
format: winston.format.simple()
})
],
exitOnError: false
});
logger.info('started');
logger.error('something went wrong', { meta: 'details' });
环境变量控制日志级别(无需改代码快速切换)
# 启动前设置
LOG_LEVEL=debug node app.js
# 或在代码中
const level = process.env.LOG_LEVEL || 'info';
三 系统层面优化与存储管理
logrotate 示例(系统级轮转,推荐与业务日志目录匹配)
# /etc/logrotate.d/myapp
/var/log/myapp/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 640 node node
sharedscripts
postrotate
systemctl reload myapp >/dev/null 2>&1 || true
endscript
}
关键点:按大小/时间分割、压缩旧日志、设置保留周期、确保应用重新打开文件描述符(如发送HUP或使用systemd reload)。
存储与性能
四 安全与合规要点
五 监控 告警与持续优化