Node.js 在 Debian 上的日志管理策略
一 核心策略与分层
二 日志库与级别配置示例
// logger.js
const winston = require('winston');
const logger = winston.createLogger({
level: process.env.NODE_ENV === 'production' ? 'warn' : 'debug',
format: winston.format.combine(
winston.format.timestamp(),
winston.format.json()
),
transports: [
new winston.transports.File({ filename: 'logs/error.log', level: 'error' }),
new winston.transports.File({ filename: 'logs/combined.log' }),
new winston.transports.Console()
]
});
module.exports = logger;
// logger-pino.js
const pino = require('pino')();
pino.info({ event: 'user.login', userId: 42 }, 'user login success');
// logger-log4js.js
const log4js = require('log4js');
log4js.configure({
appenders: {
console: { type: 'console' },
file: { type: 'file', filename: 'logs/app.log' }
},
categories: { default: { appenders: ['console', 'file'], level: 'info' } }
});
const logger = log4js.getLogger('app');
logger.info('Hello from log4js');
// app.js
const express = require('express');
const morgan = require('morgan');
const logger = require('./logger'); // Winston/Pino
const app = express();
app.use(morgan('combined', { stream: { write: msg => logger.info(msg.trim()) } }));
npm i -g pm2
pm2 start app.js --name my-app
pm2 logs my-app
以上示例覆盖了常用的日志库、级别控制、结构化输出与进程管理的基本用法。
三 轮转与保留策略
// logger-rotate.js
const { createLogger, format, transports } = require('winston');
const DailyRotateFile = require('winston-daily-rotate-file');
const transport = new DailyRotateFile({
filename: 'logs/application-%DATE%.log',
datePattern: 'YYYY-MM-DD-HH',
zippedArchive: true,
maxSize: '20m',
maxFiles: '14d'
});
const logger = createLogger({
level: 'info',
format: format.combine(format.timestamp(), format.json()),
transports: [transport]
});
# /etc/logrotate.d/nodejs
/var/log/nodejs/*.log {
daily
rotate 7
missingok
notifempty
compress
delaycompress
sharedscripts
postrotate
systemctl reload pm2-myapp >/dev/null 2>&1 || true
endscript
}
pm2 install pm2-logrotate
pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 7
docker run -d --name my_app \
--log-driver json-file \
--log-opt max-size=10m \
--log-opt max-file=3 \
my_image
以上策略确保日志文件不会无限增长,同时兼顾本地保留与历史归档需求。
四 集中化与系统日志集成
// logger-syslog.js
const winston = require('winston');
const SyslogTransport = require('winston-syslog').SyslogTransport;
const logger = winston.createLogger({
transports: [
new SyslogTransport({
host: 'localhost',
port: 514,
protocol: 'udp4'
})
]
});
logger.info('Sent to syslog');
// 命令行示例:将应用 stdout/stderr 送入 journald
// systemd-cat -t my-app -p info node app.js
五 生产落地清单