在Ubuntu上分析Node.js日志趋势,需通过日志收集→格式规范→工具分析→趋势可视化的流程,以下是具体步骤及工具推荐:
要让日志易于分析,需先确保Node.js应用输出结构化、可解析的日志。常用日志库及配置如下:
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' }) // 所有级别日志
]
});
// 生产环境关闭控制台输出(避免影响性能)
if (process.env.NODE_ENV !== 'production') {
logger.add(new winston.transports.Console({ format: winston.format.simple() }));
}
const bunyan = require('bunyan');
const logger = bunyan.createLogger({ name: 'myapp' });
logger.info('Server started', { port: 3000 }); // 包含额外字段(如port)
const pino = require('pino')();
pino.info('User logged in', { userId: 123 }); // 轻量且快速
关键点:确保日志包含时间戳、日志级别、关键字段(如请求ID、用户ID、响应时间),便于后续过滤和分析。
日志文件定位:
Node.js日志通常位于应用根目录的logs文件夹(如./logs/combined.log)或/var/log/nodejs/(若配置了系统日志)。可通过以下命令查找:
find / -name "*.log" 2>/dev/null | grep node
日志轮转(避免文件过大):
使用logrotate工具自动切割、压缩旧日志。创建配置文件/etc/logrotate.d/nodejs:
/var/log/nodejs/*.log {
daily # 每天轮转
missingok # 文件不存在不报错
rotate 7 # 保留7天日志
compress # 压缩旧日志(.gz格式)
notifempty # 空文件不轮转
create 0640 root adm # 新日志权限
}
手动测试轮转:sudo logrotate -vf /etc/logrotate.d/nodejs。
对于小型日志文件,可通过Ubuntu自带的命令行工具快速提取趋势:
tail -f /var/log/nodejs/combined.log # 实时输出新增日志
grep -c '"level":"error"' /var/log/nodejs/combined.log # 统计ERROR级别日志数
grep '2025-09-01' /var/log/nodejs/combined.log # 提取某一天的日志
responseTime字段,可通过awk计算平均值:awk -F'responseTime=' '{sum+=$2} END {print "Average response time:", sum/NR}' /var/log/nodejs/access.log
grep -i 'database connection failed' /var/log/nodejs/error.log
适用场景:快速排查问题、统计简单指标,无需复杂可视化。
对于大型应用或需要可视化、告警、长期存储的场景,推荐以下工具:
sudo apt install elasticsearch logstash kibana;/etc/logstash/conf.d/nodejs.conf):input {
file {
path => "/var/log/nodejs/combined.log"
start_position => "beginning"
sincedb_path => "/dev/null" # 首次运行从文件开头读取
}
}
filter {
json { source => "message" } # 解析JSON格式日志
date { match => ["timestamp", "ISO8601"] } # 转换时间戳格式
}
output {
elasticsearch {
hosts => ["localhost:9200"]
index => "nodejs-logs-%{+YYYY.MM.dd}" # 按日期分索引
}
}
sudo systemctl start elasticsearch logstash kibana;nodejs-*),通过“Discover”查看日志,“Visualize”创建趋势图(如错误率折线图)。docker run -d --name=loki -p 3100:3100 grafana/loki:latest;# /etc/promtail/config.yml
server:
http_listen_port: 9080
grpc_listen_port: 0
positions:
filename: /tmp/positions.yaml
clients:
- url: http://localhost:3100/loki/api/v1/push
scrape_configs:
- job_name: nodejs
static_configs:
- targets:
- localhost
labels:
job: nodejs
__path__: /var/log/nodejs/*.log
docker run -d --name=promtail -v $(pwd)/config.yml:/etc/promtail/config.yml -v /var/log/nodejs:/var/log/nodejs -p 9080:9080 grafana/promtail:latest;apt install graylog-server);自动化脚本:
编写Python/Shell脚本定期分析日志并生成报告。例如,Python脚本统计每日错误数:
import os
from collections import defaultdict
log_file = '/var/log/nodejs/combined.log'
daily_errors = defaultdict(int)
with open(log_file, 'r') as f:
for line in f:
if '"level":"error"' in line:
# 提取日期(假设日志格式为2025-09-01T12:00:00Z)
date = line.split('timestamp":"')[1].split('T')[0]
daily_errors[date] += 1
# 输出报告
for date, count in sorted(daily_errors.items()):
print(f"{date}: {count} errors")
通过cron每天定时运行:0 0 * * * /usr/bin/python3 /path/to/script.py > /var/log/nodejs/error_report.txt。
告警集成:
通过以上步骤,可实现从日志收集→规范存储→趋势分析→告警通知的完整流程,有效监控Node.js应用的健康状态。