发布于2026-05-21 阅读(0)
扫一扫,手机访问
在CentOS服务器上部署Node.js应用后,面对海量的日志数据,如何快速定位问题、洞察性能瓶颈?一套成熟的ELK(Elasticsearch, Logstash, Kibana)技术栈,或许就是你正在寻找的答案。它能将分散的日志集中管理,并提供强大的搜索、分析和可视化能力。今天,我们就来手把手搭建一套用于分析Ja vaScript(尤其是Node.js)日志的ELK系统。

在动手之前,先理清几个关键点:各个组件扮演什么角色,网络端口如何规划,以及你的日志应该以何种形态产出。
firewall-cmd --permanent --add-port={9200,9300,5601,5044}/tcpfirewall-cmd --reload万事俱备,现在开始部署。我们以ELK 7.x版本为例,通过YUM包管理器进行安装。
yum install -y elasticsearch logstash kibana。systemctl enable --now elasticsearchsystemctl enable --now logstashsystemctl enable --now kibanacurl -X GET “http://localhost:9200/”,如果返回包含版本号的JSON信息,说明服务正常。http://<你的服务器IP>:5601,如果能打开Kibana的初始化页面,说明整个栈的基础服务已经就绪。服务跑起来了,接下来是关键一步:如何把Node.js产生的日志“喂”给ELK。这里提供两种主流方案。
/etc/filebeat/filebeat.yml):
filebeat.inputs:
- type: log
paths:
- /var/log/nodejs/*.log
fields:
log_type: nodejs
output.logstash:
hosts: [“localhost:5044”]
/etc/logstash/conf.d/nodejs.conf):
input {
beats {
port => 5044
}
}
filter {
# 假设日志是JSON格式,直接解析
json {
source => “message”
target => “json”
remove_field => [“message”]
}
# 字段重命名,使其更规范
mutate {
rename => { “[json][level]” => “log_level” }
rename => { “[json][msg]” => “message” }
rename => { “[json][time]” => “timestamp” }
convert => { “response_time” => “float” }
}
# 设置时间戳字段
date {
match => [ “timestamp”, “ISO8601”, “yyyy-MM-dd HH:mm:ss.SSS” ]
target => “@timestamp”
}
# 为错误日志打上标签
if [log_level] == “ERROR” {
mutate { add_tag => [“error”] }
}
}
output {
elasticsearch {
hosts => [“http://localhost:9200”]
index => “nodejs-logs-%{+YYYY.MM.dd}” # 按天创建索引
}
stdout { codec => rubydebug } # 可选,用于调试时在控制台输出
}
/etc/systemd/system/nodeapp.service):
[Service] ExecStart=/usr/bin/node /opt/app/index.js StandardOutput=journal StandardError=journal SyslogIdentifier=nodeapp
const winston = require(‘winston’);
const logger = winston.createLogger({
level: ‘info’,
format: winston.format.json(),
transports: [
new winston.transports.File({ filename: ‘/var/log/nodejs/app.log’ })
]
});
logger.info({ msg: ‘User login’, userId: 123, ip: ‘10.0.0.1’ });
logger.error({ msg: ‘DB timeout’, err: ‘timeout’, duration_ms: 3200 });
数据已经源源不断地流入Elasticsearch,是时候在Kibana中让它们“说话”了。
nodejs-logs-* 来匹配我们按天创建的索引。@timestamp。同时,检查字段类型是否正确,例如确保 log_level 被识别为keyword(用于精确筛选和聚合),response_time 被识别为number。@timestamp。log_level,就能看到不同级别日志随时间的变化趋势。response_time。url.path 或 route,按平均响应时间排序,一眼找出最慢的接口。log_level: ERROR。message、url、stack、userId、ip 和 @timestamp,方便逐条排查。系统上线后,持续的运维和调优才能保证其长期稳定、高效运行。
/etc/logrotate.d/nodejs):
/var/log/nodejs/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 0640 nodejs nodejs
sharedscripts
postrotate
systemctl reload filebeat >/dev/null 2>&1 || true
endscript
}
这个配置会每天轮转日志,保留最近7天,并在轮转后通知Filebeat重新打开文件。pipeline.workers,根据数据量调整 pipeline.batch.size,以平衡吞吐量和延迟。harvester_limit 限制同时打开的文件数,通过 close_inactive 及时关闭不活跃的文件句柄。keyword 类型,避免text类型分词带来的性能开销。nodejs-logs-YYYY.MM.dd),并配置索引生命周期管理(ILM)策略,自动实现索引的滚动(Rollover)、冻结(Freeze)和删除(Delete),有效控制存储成本。下一篇:如何在XMind中插入图片
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8