在 Debian 上用 Node.js 日志做用户行为分析的可落地方案
一 日志采集与结构化
// logger.js
const winston = require('winston');
const { createLogger, format, transports } = winston;
const DailyRotateFile = require('winston-daily-rotate-file');
const appLogger = createLogger({
level: process.env.NODE_ENV === 'development' ? 'debug' : 'info',
format: format.combine(
format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss.SSS' }),
format.errors({ stack: true }),
format.json()
),
transports: [
new DailyRotateFile({
filename: 'logs/application-%DATE%.log',
datePattern: 'YYYY-MM-DD',
zippedArchive: true,
maxSize: '20m',
maxFiles: '14d'
}),
new transports.Console({ format: format.combine(format.colorize(), format.simple()) })
]
});
module.exports = appLogger;
二 日志轮转与系统日志管理
/path/to/your.log {
daily
missingok
rotate 7
compress
notifempty
create 0640 nodejs nodejs
postrotate
systemctl reload myapp >/dev/null 2>&1 || true
endscript
}
三 快速分析命令与指标计算
tail -f logs/application-2025-11-28.loggrep "page_view" logs/application-2025-11-28.log | head -n 100grep "page_view" logs/app.log | awk -F'"path":"' '{print $2}' | awk -F'"' '{print $1}' | sort | uniq -c | sort -nr | headgrep "page_view" logs/app.log | awk -F'"timestamp":"' '{print $2}' | cut -d'T' -f1,2 | cut -d'.' -f1 | sort | uniq -cgrep "page_view" logs/app.log | awk '{s[$9]++} END {print "5xx:", s["5xx"]/(s["2xx"]+s["3xx"]+s["4xx"]+s["5xx"])*100"%"}'grep "page_view" logs/app.log | awk '{s[$9]++} END {for (k in s) print k, s[k]}' | sort -nrgrep "page_view" logs/app.log | awk -F'"duration":' '{sum+=$2; n++} END {print "avg ms:", sum/n}'四 集中化存储与可视化
五 落地实施清单