Debian JS日志如何配置
小樊
39
2025-12-08 11:13:48
Debian 上配置 JS 日志的实用方案
一 选择日志库与输出目标
- 常用库与场景
- Winston:功能全面,支持多传输(文件、控制台、HTTP 等)、多格式,适合中大型项目。
- Pino:高性能,生产环境友好,配合 pino-pretty 可在开发环境获得可读输出。
- Morgan:Express 的 HTTP 请求日志中间件,专注记录访问日志。
- Log4js:配置化能力强,支持按类别输出与滚动。
- 快速示例
- Winston(按级别分流到文件与控制台)
- 安装:
npm install winston
- 配置:
- const winston = require(‘winston’);
- const logger = winston.createLogger({
level: ‘info’,
format: winston.format.json(),
transports: [
new winston.transports.File({ filename: ‘error.log’, level: ‘error’ }),
new winston.transports.File({ filename: ‘combined.log’ }),
new winston.transports.Console({ format: winston.format.simple() })
]
});
- Pino(开发期彩色可读,生产期 JSON)
- 安装:
npm install pino pino-pretty
- 配置:
- const pino = require(‘pino’);
- const logger = pino({
level: ‘info’,
transport: process.env.NODE_ENV !== ‘production’
? { target: ‘pino-pretty’, options: { colorize: true } }
: undefined
});
- Morgan(记录 HTTP 请求)
- 安装:
npm install morgan
- 配置(Express):
- const morgan = require(‘morgan’);
- app.use(morgan(‘combined’)); // 或 ‘dev’/‘tiny’ 等预设
二 日志级别与动态控制
- 级别设置
- 常见级别(由低到高):error < warn < info < debug。设置 logger 的 level 后,只有大于等于该级别的日志会被输出。
- 运行时通过环境变量控制
- 代码示例:
- const logLevel = process.env.LOG_LEVEL || ‘info’;
- const logger = winston.createLogger({ level: logLevel, … });
- 启动命令:
- LOG_LEVEL=debug node app.js
- 环境区分
- 生产环境建议输出 JSON 到文件,开发环境输出 可读格式 到控制台,便于排查。
- if (process.env.NODE_ENV !== ‘production’) { logger.add(new winston.transports.Console({ format: winston.format.simple() })); }
三 日志轮转与保留策略
- 应用内轮转(推荐与文件输出配合)
- Winston + winston-daily-rotate-file:
- 安装:
npm install winston-daily-rotate-file
- 配置:
- const DailyRotateFile = require(‘winston-daily-rotate-file’);
- new DailyRotateFile({
filename: ‘application-%DATE%.log’,
datePattern: ‘YYYY-MM-DD-HH’,
zippedArchive: true,
maxSize: ‘20m’,
maxFiles: ‘14d’
})
- 系统级轮转(对 Node 写出的 *.log 文件统一处理)
- 使用 logrotate(Debian 自带)
- 新建配置:
sudo nano /etc/logrotate.d/nodejs
- 示例:
- /path/to/your/nodejs/logs/*.log {
daily
rotate 7
compress
missingok
notifempty
create 0644 root root
}
- 校验与强制执行:
- sudo logrotate -d /etc/logrotate.d/nodejs
- sudo logrotate -f /etc/logrotate.d/nodejs
- 何时用哪种
- 单进程/单实例:应用内轮转更直观。
- 多实例/多文件/容器:系统级 logrotate 更易统一运维。
四 运行与运维实践
- 使用 PM2 管理进程与日志
- 安装:
sudo npm install -g pm2
- 启动:
pm2 start app.js --name "my-app"
- 分别记录错误与标准输出:
- 命令行:
pm2 start app.js --name "my-app" --error err.log --output out.log
- 或在 ecosystem.config.js:
- module.exports = { apps: [{ name: ‘my-app’, script: ‘app.js’, error_file: ‘err.log’, out_file: ‘out.log’ }] }
- 查看日志:
pm2 logs my-app
- 命令行查看与检索
- 实时查看:
tail -f app.log
- 关键字检索:
cat app.log | grep "error"
- 反向代理日志(如 Nginx)
- 自定义访问日志格式并写入 /var/log/nginx/access.log,便于与后端日志关联分析。
五 集中式日志与可视化
- 将日志发送到 ELK Stack(Elasticsearch, Logstash, Kibana) 或其他集中式系统,便于检索、分析与告警。
- 结合 Prometheus + Grafana 做指标可视化与阈值告警,形成可观测性闭环。