Ubuntu Node.js日志中追踪用户行为的方法
在Ubuntu环境下,通过Node.js追踪用户行为需围绕日志记录-存储-解析-分析的流程展开,以下是具体步骤及工具推荐:
Node.js生态中有多个成熟的日志库,可根据需求选择:
npm install <库名>安装。以winston为例,配置JSON格式日志(便于后续解析),并将日志输出到文件和控制台:
const winston = require('winston');
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(), // 使用JSON格式
transports: [
new winston.transports.File({ filename: 'logs/error.log', level: 'error' }), // 错误日志单独存储
new winston.transports.File({ filename: 'logs/combined.log' }), // 所有日志合并
...(process.env.NODE_ENV !== 'production' ? [new winston.transports.Console({ format: winston.format.simple() })] : []) // 开发环境输出到控制台
]
});
记录用户行为时,需包含用户ID、操作类型、时间戳等关键信息(如登录、访问页面、API调用):
// 用户登录日志
app.post('/login', (req, res) => {
const { username, userId } = req.body;
logger.info({ userId, action: 'login', timestamp: new Date().toISOString() }, 'User logged in');
res.send('Login successful');
});
// 页面访问日志
app.get('/home', (req, res) => {
const userId = req.headers['x-user-id']; // 从请求头获取用户ID(需提前认证)
logger.info({ userId, action: 'visit', path: '/home', timestamp: new Date().toISOString() }, 'User visited home page');
res.send('Welcome to home page');
});
/var/log/nodejs/),需确保应用有写入权限:sudo mkdir -p /var/log/nodejs
sudo chown -R $USER:$USER /var/log/nodejs
@elastic/elasticsearch库写入ES)。grep、awk快速筛选日志(如查找用户123的所有操作):grep '"userId": "123"' /var/log/nodejs/combined.log
awk -F'"userId": "' '/"userId": "123"/ {print $2}' /var/log/nodejs/combined.log | cut -d'"' -f1
// JavaScript解析(Node.js)
const fs = require('fs');
const readline = require('readline');
const logFile = 'logs/combined.log';
const rl = readline.createInterface({ input: fs.createReadStream(logFile) });
let pageViews = {};
rl.on('line', (line) => {
const logEntry = JSON.parse(line);
if (logEntry.action === 'visit') {
const path = logEntry.path;
pageViews[path] = (pageViews[path] || 0) + 1;
}
}).on('close', () => {
console.log('Page views:', pageViews);
});
# Python解析
import json
import re
log_file = 'logs/combined.log'
pattern = r'"userId": "(.*?)"'
with open(log_file, 'r') as file:
for line in file:
match = re.search(pattern, line)
if match:
user_id = match.group(1)
print(f"User ID: {user_id}")
pm2结合node-log-monitor实时查看日志流(如用户登录事件):npm install pm2 node-log-monitor -g
pm2 start app.js
node-log-monitor --path /var/log/nodejs/combined.log
winston.format.mask插件屏蔽敏感字段)。logrotate工具防止日志文件过大(如每天分割日志、保留7天):sudo nano /etc/logrotate.d/nodejs
添加以下内容:/var/log/nodejs/*.log {
daily
missingok
rotate 7
compress
notifempty
create 0640 $USER adm
}
transports.Console默认异步)或专门的日志服务(如Loggly),避免影响应用性能。