Ubuntu 环境下优化 JS 日志存储的实用方案
一 核心策略与取舍
二 应用内日志配置示例
npm i winston winston-daily-rotate-file
const winston = require('winston');
const { DailyRotateFile } = require('winston-daily-rotate-file');
const transport = new DailyRotateFile({
filename: '/var/log/myapp/application-%DATE%.log',
datePattern: 'YYYY-MM-DD',
zippedArchive: true,
maxSize: '20m',
maxFiles: '14d'
});
const logger = winston.createLogger({
level: process.env.NODE_ENV === 'production' ? 'info' : 'debug',
format: winston.format.combine(
winston.format.timestamp(),
winston.format.json()
),
transports: [
new winston.transports.File({ filename: '/var/log/myapp/error.log', level: 'error' }),
transport,
new winston.transports.Console({ format: winston.format.simple() })
]
});
logger.info('上线完成', { version: '1.2.3' });
logger.error('数据库不可用', { err: err.message });
npm i pino pino-pretty
// 生产:JSON 输出到文件
const pino = require('pino');
const fs = require('fs');
const log = pino(fs.createWriteStream('/var/log/myapp/app.jsonl'), { level: 'info' });
// 开发:控制台美化
// const pino = require('pino')({ transport: { target: 'pino-pretty' } });
log.info({ user: 'alice' }, '用户登录');
log.error({ err: err }, '操作失败');
npm i bunyan
const bunyan = require('bunyan');
const logger = bunyan.createLogger({
name: 'myapp',
streams: [
{ level: 'info', stream: process.stdout },
{ level: 'error', path: '/var/log/myapp/error.log' }
]
});
以上示例覆盖了常见的结构化日志、分级、按天/按大小切分、压缩与保留等关键能力。
三 系统级日志轮转与保留
sudo apt-get update && sudo apt-get install logrotatesudo nano /etc/logrotate.d/myapp/var/log/myapp/*.log {
daily
rotate 14
compress
delaycompress
missingok
notifempty
create 640 node node
copytruncate
}
sudo logrotate -d /etc/logrotate.confsudo logrotate -f /etc/logrotate.d/myapp四 集中化存储与监控告警
五 性能与安全最佳实践