发布于2026-07-13 阅读(0)
扫一扫,手机访问
聊聊CentOS上Node.js日志的配置与管理,其实核心思路就那么几条。无论你是刚接触服务端开发,还是已经在生产环境摸爬滚打多年,日志这件事都绕不开——它既是调试的拐杖,也是运维的眼睛。下面直接进入正题。

选对工具,事半功倍。在应用内部,有几款日志库值得优先考虑:
在系统层面,logrotate 是管理日志轮转与压缩的老牌工具,非常适合长期运行的服务。如果用了进程管理器,PM2 自带日志聚合查看功能,能大大简化开发和运维的日常工作。
一旦服务规模上来,就需要考虑集中式日志了。常见的做法是通过 rsyslog(UDP/TCP 514端口)把日志发到远程,或者接入 Logstash、Fluentd 这类数据管道,最终落地到 ELK(Elasticsearch、Logstash、Kibana)体系中进行存储和可视化。
日志级别的设置,建议开发环境用 debug,生产环境用 info/warn/error 分层输出,这样既能过滤冗余信息,又能方便告警。
纸上谈兵不如直接看代码。先看一个使用 Winston 输出到控制台与文件的经典配置,特别之处在于它按错误和全量做了分离:
// logger.js
const { createLogger, format, transports } = require('winston');
const logger = createLogger({
level: 'info',
format: format.combine(
format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
format.json()
),
transports: [
new transports.File({ filename: 'logs/error.log', level: 'error' }),
new transports.File({ filename: 'logs/combined.log' }),
new transports.Console()
]
});
module.exports = logger;
如果希望日志按天滚动并自动压缩,可以引入 winston-daily-rotate-file 插件:
// logger-daily.js
const { createLogger, format, transports } = require('winston');
const DailyRotateFile = require('winston-daily-rotate-file');
const logger = createLogger({
level: 'info',
format: format.combine(
format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
format.printf(({ timestamp, level, message }) => {
return `[${timestamp}] ${level.toUpperCase()}: ${message}`;
})
),
transports: [
new DailyRotateFile({
filename: 'logs/app-%DATE%.log',
datePattern: 'YYYY-MM-DD',
zippedArchive: true,
maxSize: '20m',
maxFiles: '14d'
})
]
});
module.exports = logger;
再看一个 Log4js 的配置,同样支持按时间滚动:
// logger-log4js.js
const log4js = require('log4js');
log4js.configure({
appenders: {
out: { type: 'console' },
app: {
type: 'dateFile',
filename: 'logs/app',
pattern: '.yyyy-MM-dd.log',
compress: true,
alwaysIncludePattern: true
}
},
categories: {
default: { appenders: ['out', 'app'], level: 'info' }
}
});
const logger = log4js.getLogger();
module.exports = logger;
这里有个建议:生产环境优先输出 JSON 格式到文件,这样后续检索和聚合会很方便;控制台输出则留给本地开发和调试就好。
对于使用 systemd 或长期运行的进程,logrotate 是系统级的可靠选择。配置起来很简单:
创建一个配置文件 /etc/logrotate.d/nodejs_app,内容如下:
/path/to/your/nodejs/app/logs/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 0640 root root
}
然后手动测试一下:sudo logrotate -f /etc/logrotate.d/nodejs_app。在 CentOS 上,logrotate 默认由 cron.daily 每日触发,所以不需要额外设置定时任务。
那么,到底该用应用内轮转还是系统级轮转?这取决于场景:
winston-daily-rotate-file)控制更精细,可以同时按大小和日期双重管理,适合容器化或多实例部署。PM2 是 Node.js 进程管理的利器,它的日志管理功能也很实用:
npm install pm2 -gpm2 start app.js --name my-node-apppm2 logs my-node-apppm2 set pm2-logrotate:max_size 10Mpm2 set pm2-logrotate:retain 7如果想将日志发送到远程 rsyslog 服务器,流程也很清晰。首先在服务端启用 UDP 514 端口:编辑 /etc/rsyslog.conf,取消注释并启动模块:
module(load="imudp")
input(type="imudp" port="514")
然后重启服务:sudo systemctl restart rsyslog
在客户端,通过 Winston 的 Syslog 插件发送日志:
const { createLogger, transports } = require('winston');
const SyslogTransport = require('winston-syslog').SyslogTransport;
const logger = createLogger({
level: 'info',
transports: [
new SyslogTransport({
host: '192.0.2.10', // 远程 rsyslog 地址
port: 514,
protocol: 'udp4'
})
]
});
再往上走一步,就是搭建完整的集中式分析平台了:日志从 Logstash 流入 Elasticsearch,最后在 Kibana 中实现检索、聚合与可视化。这套组合拳在大型系统中几乎是标配。
最后,总结几条生产环境下的经验,值得记下来:
/var/log/yourapp/,目录权限设为 0755,日志文件设为 0640,属主设置为运行用户(如 nodejs 或 appuser)。debug,生产用 info/warn/error。通过环境变量来控制日志级别和输出目标,灵活又安全。requestId/traceId。高并发场景下,对 debug/trace 级别的日志做采样,避免性能抖动。error 关键字、日志写入速率异常、磁盘使用率等设置监控和告警,别等磁盘写满才去处理。说到底,日志管理这件事,工具选对、配置做细、规则定好,后续运维就会省心很多。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8