Ubuntu 上 Node.js 日志策略配置指南
一 核心策略与选型
二 应用内日志配置示例
const { createLogger, format, transports } = require('winston');
const DailyRotateFile = require('winston-daily-rotate-file');
const logger = createLogger({
level: process.env.LOG_LEVEL || 'info',
format: format.combine(
format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
format.json()
),
defaultMeta: { service: 'my-app' },
transports: [
new DailyRotateFile({
filename: '/var/log/myapp/application-%DATE%.log',
datePattern: 'YYYY-MM-DD',
zippedArchive: true,
maxSize: '20m',
maxFiles: '14d'
}),
new transports.Console({ format: format.simple() })
]
});
logger.info('服务启动', { port: 3000 });
logger.error('数据库不可用', { err: err.message });
const express = require('express');
const morgan = require('morgan');
const fs = require('fs');
const path = require('path');
const app = express();
const accessLogStream = fs.createWriteStream(
path.join(__dirname, 'logs', 'access.log'), { flags: 'a' }
);
app.use(morgan('combined', { stream: accessLogStream }));
app.get('/', (req, res) => res.send('Hello World'));
app.listen(3000);
三 运行方式与系统日志集成
[Unit]
Description=My Node.js App
After=network.target
[Service]
Type=simple
User=www-data
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/node /opt/myapp/app.js
Restart=always
StandardOutput=journal
StandardError=journal
SyslogIdentifier=myapp
[Install]
WantedBy=multi-user.target
四 日志轮转与自动清理
/var/log/myapp/*.log {
daily
missingok
rotate 7
compress
notifempty
create 0640 www-data adm
copytruncate
}
#!/usr/bin/env bash
LOG_DIR="/var/log/myapp"
find "$LOG_DIR" -type f -name "*.gz" -mtime +7 -delete
五 集中化与监控实践