ELK堆栈处理结构化日志的效率更高,因此需要先将Node.js日志输出为JSON格式(推荐使用winston库)。以下是配置示例:
// logger.js
const winston = require('winston');
const logger = winston.createLogger({
level: 'info',
format: winston.format.combine(
winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }), // 添加时间戳
winston.format.json() // 输出JSON格式
),
transports: [
new winston.transports.Console(), // 输出到控制台(调试用)
new winston.transports.File({ filename: '/var/log/nodejs/app.log' }) // 输出到文件(ELK收集用)
]
});
module.exports = logger;
在Node.js应用中引入该logger:
const logger = require('./logger');
logger.info('Application started', { port: 3000 }); // 示例日志(包含额外字段)
logger.error('Database connection failed', { error: 'ECONNREFUSED' });
说明:JSON格式的日志便于Logstash解析,timestamp和level字段是ELK分析的基础,额外字段(如port、error)可用于后续过滤和可视化。
sudo apt update
sudo apt install openjdk-17-jdk -y
java -version # 验证安装(需显示17.x版本)
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.10.0-amd64.deb
sudo dpkg -i elasticsearch-8.10.0-amd64.deb
sudo systemctl enable elasticsearch
sudo systemctl start elasticsearch
curl -X GET 'localhost:9200' # 验证(返回集群信息即成功)
wget https://artifacts.elastic.co/downloads/kibana/kibana-8.10.0-amd64.deb
sudo dpkg -i kibana-8.10.0-amd64.deb
sudo systemctl enable kibana
sudo systemctl start kibana
访问http://<服务器IP>:5601,进入Kibana Web界面(默认无需认证,生产环境需配置密码)。
sudo mkdir -p /etc/logstash/conf.d
sudo nano /etc/logstash/conf.d/nodejs.conf
写入以下内容(根据实际路径调整):
input {
file {
path => "/var/log/nodejs/app.log" # Node.js日志文件路径
start_position => "beginning" # 从头开始读取(首次配置需设置为beginning,后续改为end)
sincedb_path => "/dev/null" # 忽略sincedb文件(避免重复读取)
codec => "json" # 解析JSON格式日志
}
}
filter {
# 可选:提取日志中的额外字段(如port、error)
grok {
match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:loglevel} %{GREEDYDATA:message}" }
}
date {
match => ["timestamp", "yyyy-MM-dd HH:mm:ss"] # 统一日志时间格式
target => "@timestamp" # 映射到Elasticsearch的@timestamp字段
}
}
output {
elasticsearch {
hosts => ["localhost:9200"] # Elasticsearch地址
index => "nodejs-logs-%{+YYYY.MM.dd}" # 按日期分索引(如nodejs-logs-2025.10.11)
}
stdout { codec => rubydebug } # 控制台输出(调试用,生产环境可注释)
}
sudo systemctl enable logstash
sudo systemctl start logstash
查看Logstash日志确认是否正常:
sudo journalctl -u logstash -f
若出现Pipeline started表示配置成功。
http://<服务器IP>:5601),进入Stack Management > Index Patterns。nodejs-logs-*(匹配Logstash输出的索引名称)。@timestamp作为时间过滤字段,点击Create index pattern。nodejs-logs-*。Count(计数),Buckets栏选择X-axis。Terms聚合,字段选择loglevel.keyword(日志级别)。Log Level Distribution。Count,Buckets栏选择X-axis。Date Histogram聚合,字段选择@timestamp,间隔选择Daily(每日)。Terms,字段选择loglevel.keyword(区分不同级别)。Error Trend。Log Level Distribution和Error Trend可视化。Node.js Logs Dashboard。在Kibana顶部导航栏输入Discover,选择nodejs-logs-*索引模式,可通过以下方式搜索:
loglevel: "error"(查找所有错误日志)。@timestamp >= "now-1h" AND loglevel: "error"(查找最近1小时的错误日志)。logrotate防止日志文件过大,配置示例:sudo nano /etc/logrotate.d/nodejs
内容如下:/var/log/nodejs/*.log {
daily
missingok
rotate 7
compress
notifempty
create 0640 root adm
}
filter中添加mutate插件,移除敏感字段(如密码):filter {
mutate {
remove_field => ["password", "credit_card"]
}
}
Filebeat(轻量级日志收集器)替代Logstash的file输入插件,减轻服务器负担。通过以上步骤,即可用ELK堆栈实现Ubuntu Node.js日志的收集、存储、分析和可视化,帮助快速定位问题、监控应用状态。