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),避免影響應用性能。