在 Debian 上清晰呈现 Node.js 日志的实用方案
一 基础原则
- 使用结构化日志(如 JSON),便于检索、过滤与聚合分析。
- 合理设置日志级别(如 error、warn、info、debug),开发环境可更详细,生产环境控制输出量以降低开销。
- 统一时间戳与上下文字段(如 requestId、module、method),提升可读性与可追溯性。
- 规范日志路径与命名,便于定位与归档。
- 实施日志轮转与保留策略,避免单文件过大、磁盘被占满。
- 在 systemd 场景下优先用 journald 统一采集,必要时再写入文件。
二 本地快速查看与筛选
- 实时查看文件:tail -f app.log;查看全部:cat app.log。
- 关键字筛选:grep “error” app.log;按时间窗口查看:tail -n 1000 app.log | grep “2026-01”。
- 若由 systemd 托管:journalctl -u your-nodejs-service.service -f(实时)、-e(跳到末尾)、–since “2026-01-01 00:00:00”。
- 常见日志位置:应用自定义目录(如 /var/log/nodejs/)、或系统日志 /var/log/syslog、/var/log/messages。
三 应用侧日志结构化与美化
- 选择成熟日志库:
- Winston:多传输、易配置,适合通用场景。
- Pino:高性能、默认 JSON,适合高并发。
- Bunyan:结构化 JSON,生态完善。
- 控制台输出美化:
- Pino:使用 pino-pretty,如:node app.js | pino-pretty(可加 --colorize、–translateTime)。
- Bunyan:使用 bunyan-pretty,如:node app.js | bunyan。
- 最小可用示例(Winston,开发/生产兼顾):
- 安装:npm i winston
- 配置:
- const winston = require(‘winston’);
- const logger = winston.createLogger({
level: process.env.NODE_ENV === ‘production’ ? ‘info’ : ‘debug’,
format: winston.format.combine(
winston.format.timestamp({ format: ‘YYYY-MM-DD HH:mm:ss’ }),
winston.format.errors({ stack: true }),
winston.format.splat(),
winston.format.json()
),
transports: [
new winston.transports.File({ filename: ‘logs/error.log’, level: ‘error’ }),
new winston.transports.File({ filename: ‘logs/combined.log’ })
]
});
- if (process.env.NODE_ENV !== ‘production’) {
logger.add(new winston.transports.Console({
format: winston.format.combine(
winston.format.colorize(),
winston.format.printf(({ timestamp, level, message, …meta }) => {
return
${timestamp} ${level}: ${message} ${Object.keys(meta).length ? JSON.stringify(meta) : ''};
})
)
}));
}
- logger.info(‘服务启动’, { port: 3000 });
- 高并发场景建议选用 Pino 或将 Bunyan 输出到文件,再用 pretty 工具在本地或调试时查看。
四 日志轮转与保留策略
- 使用 winston-daily-rotate-file(按天/大小切分,自动压缩归档):
- 安装:npm i winston-daily-rotate-file
- 配置示例:
- const DailyRotateFile = require(‘winston-daily-rotate-file’);
- const rotateTransport = new DailyRotateFile({
filename: ‘logs/application-%DATE%.log’,
datePattern: ‘YYYY-MM-DD’,
zippedArchive: true,
maxSize: ‘20m’,
maxFiles: ‘14d’
});
- logger.add(rotateTransport);
- 非 JSON 输出或通用场景可用 logrotate(/etc/logrotate.d/myapp):
- /var/log/myapp/*.log {
daily
rotate 14
compress
missingok
notifempty
create 0640 node node
sharedscripts
postrotate
systemctl reload myapp.service >/dev/null
endscript
}
- 建议将 error 与 combined 分离,便于快速定位问题。
五 集中式日志与可视化
- 小规模与快速落地:将日志写入文件后,用 journalctl -u your-nodejs-service.service 集中查看与筛选。
- 中大型与多服务:引入 ELK Stack(Elasticsearch、Logstash、Kibana) 或 Graylog,统一采集、检索、分析与可视化。
- 高吞吐与云原生:使用 Fluentd / Fluent Bit 做日志转发与缓冲,降低应用侧压力。